This module defines bitwise operations for signed and unsigned integers.

- class Num a => Bits a where
- (.&.) :: a -> a -> a
- (.|.) :: a -> a -> a
- 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 :: a -> Int -> a
- shiftR :: a -> Int -> a
- rotateL :: a -> Int -> a
- rotateR :: a -> Int -> a

# Documentation

class Num a => Bits a whereSource

The `Bits`

class defines bitwise operations over integral types.

- Bits are numbered from 0 with bit 0 being the least significant bit.

Minimal complete definition: `.&.`

, `.|.`

, `xor`

, `complement`

,
(`shift`

or (`shiftL`

and `shiftR`

)), (`rotate`

or (`rotateL`

and `rotateR`

)),
`bitSize`

and `isSigned`

.

Bitwise "and"

Bitwise "or"

Bitwise "xor"

complement :: a -> aSource

Reverse all the bits in the argument

shifts `shift`

x i`x`

left by `i`

bits if `i`

is positive,
or right by `-i`

bits otherwise.
Right shifts perform sign extension on signed number types;
i.e. they fill the top bits with 1 if the `x`

is negative
and with 0 otherwise.

An instance can define either this unified `shift`

or `shiftL`

and
`shiftR`

, depending on which is more convenient for the type in
question.

rotates `rotate`

x i`x`

left by `i`

bits if `i`

is positive,
or right by `-i`

bits otherwise.

For unbounded types like `Integer`

, `rotate`

is equivalent to `shift`

.

An instance can define either this unified `rotate`

or `rotateL`

and
`rotateR`

, depending on which is more convenient for the type in
question.

`bit i`

is a value with the `i`

th bit set and all other bits clear

`x `setBit` i`

is the same as `x .|. bit i`

clearBit :: a -> Int -> aSource

`x `clearBit` i`

is the same as `x .&. complement (bit i)`

complementBit :: a -> Int -> aSource

`x `complementBit` i`

is the same as `x `xor` bit i`

testBit :: a -> Int -> BoolSource

Return `True`

if the `n`

th bit of the argument is 1

Return the number of bits in the type of the argument. The actual
value of the argument is ignored. The function `bitSize`

is
undefined for types that do not have a fixed bitsize, like `Integer`

.

Return `True`

if the argument is a signed type. The actual
value of the argument is ignored

Shift the argument left by the specified number of bits (which must be non-negative).

An instance can define either this and `shiftR`

or the unified
`shift`

, depending on which is more convenient for the type in
question.

Shift the first argument right by the specified number of bits
(which must be non-negative).
Right shifts perform sign extension on signed number types;
i.e. they fill the top bits with 1 if the `x`

is negative
and with 0 otherwise.

An instance can define either this and `shiftL`

or the unified
`shift`

, depending on which is more convenient for the type in
question.