This library defines bitwise operations for signed and unsigned ints.
Instances of `class Bits` can be obtained from the
`Int` (Section 3.11) and
`Word` (Section 3.19) modules.

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) |

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.`bit i`is the value with the i'th bit set.