module Bits where infixl 8 `shift`, `rotate` infixl 7 .&. infixl 6 `xor` infixl 5 .|. class Bits a where (.&.), (.|.), xor :: a -> a -> a complement :: a -> a shift :: a -> Int -> a rotate :: a -> Int -> a bit :: Int -> a setBit :: a -> Int -> a clearBit :: a -> Int -> a complementBit :: a -> Int -> a testBit :: a -> Int -> Bool bitSize :: a -> Int isSigned :: a -> Bool shiftL, shiftR :: Bits a => a -> Int -> a rotateL, rotateR :: Bits a => a -> Int -> a shiftL a i = shift a i shiftR a i = shift a (-i) rotateL a i = rotate a i rotateR a i = rotate a (-i)
bitSize and isSigned are like floatRadix and floatDigits—they return parameters of the type of their argument rather than of the particular argument they are applied to. bitSize returns the number of bits in the type; and isSigned returns whether the type is signed or not.
shift performs sign extension on signed number types. That is, right shifts fill the top bits with 1 if the number is negative and with 0 otherwise.
Bits are numbered from 0 with bit 0 being the least significant bit.
shift x i and rotate x i shift to the left if i is positive and to the right otherwise.
bit i is the value with the i'th bit set.