This module defines bitwise operations for signed and unsigned ints. Instances of class Bits for the Int and Integer types are available from this module, and instances for explicitly sized integral types are available from the Int (Section 4.18) and Word (Section 4.38) modules.
infixl 8 `shift`, `rotate` infixl 7 .&. infixl 6 `xor` infixl 5 .|. class Num a => 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 bit i = shift 0x1 i setBit x i = x .|. bit i clearBit x i = x .&. complement (bit i) complementBit x i = x `xor` bit i testBit x i = (x .&. bit i) /= 0 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) instance Bits Int instance Bits Integer |
Notes:
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.
rotate is well defined only if bitSize is also well defined (bitSize is undefined for Integer, for example).
bit i is the value with the i'th bit set.