24 lines
648 B
Haskell
24 lines
648 B
Haskell
import Data.Bits
|
|
import Data.Char
|
|
import Numeric
|
|
import Control.Monad
|
|
import Text.Printf
|
|
|
|
grayToBin :: (Integral t, Bits t) => t -> t
|
|
grayToBin 0 = 0
|
|
grayToBin g = g `xor` (grayToBin $ g `shiftR` 1)
|
|
|
|
binToGray :: (Integral t, Bits t) => t -> t
|
|
binToGray b = b `xor` (b `shiftR` 1)
|
|
|
|
showBinary :: (Integral t, Show t) => t -> String
|
|
showBinary n = showIntAtBase 2 intToDigit n ""
|
|
|
|
showGrayCode :: (Integral t, Bits t, PrintfArg t, Show t) => t -> IO ()
|
|
showGrayCode num = do
|
|
let bin = showBinary num
|
|
let gray = showBinary (binToGray num)
|
|
printf "int: %2d -> bin: %5s -> gray: %5s\n" num bin gray
|
|
|
|
main = forM_ [0..31::Int] showGrayCode
|