circe-0.1.0.0: lib/Codec/Circe/Reflect.hs
-- | Reflect bits
module Codec.Circe.Reflect (ref32, ref16, ref8) where
import Data.Bits
import Data.Word
-- | Reflect 'Word32'
ref32 :: Word32 -> Word32
ref32 = s1 . s2 . s4 . s8 . s16
where
s1 n = ((n .&. 0xAAAAAAAA) `shiftR` 1) .|. ((n .&. 0x55555555) `shiftL` 1)
s2 n = ((n .&. 0xCCCCCCCC) `shiftR` 2) .|. ((n .&. 0x33333333) `shiftL` 2)
s4 n = ((n .&. 0xF0F0F0F0) `shiftR` 4) .|. ((n .&. 0x0F0F0F0F) `shiftL` 4)
s8 n = ((n .&. 0xFF00FF00) `shiftR` 8) .|. ((n .&. 0x00FF00FF) `shiftL` 8)
s16 n = (n `shiftR` 16) .|. (n `shiftL` 16)
-- | Reflect 'Word16'
ref16 :: Word16 -> Word16
ref16 = s1 . s2 . s4 . s8
where
s1 n = ((n .&. 0xAAAA) `shiftR` 1) .|. ((n .&. 0x5555) `shiftL` 1)
s2 n = ((n .&. 0xCCCC) `shiftR` 2) .|. ((n .&. 0x3333) `shiftL` 2)
s4 n = ((n .&. 0xF0F0) `shiftR` 4) .|. ((n .&. 0x0F0F) `shiftL` 4)
s8 n = (n `shiftR` 8) .|. (n `shiftL` 8)
-- | Reflect 'Word8'
ref8 :: Word8 -> Word8
ref8 = s1 . s2 . s4
where
s1 n = ((n .&. 0xAA) `shiftR` 1) .|. ((n .&. 0x55) `shiftL` 1)
s2 n = ((n .&. 0xCC) `shiftR` 2) .|. ((n .&. 0x33) `shiftL` 2)
s4 n = (n `shiftR` 4) .|. (n `shiftL` 4)