Bit Manipulation
Reference
4 bit signed integer decimal to binary table
| decimal | binary | decimal | binary |
|---|---|---|---|
| -8 | 1000 | 7 | 0111 |
| -7 | 1001 | 6 | 0110 |
| -6 | 1010 | 5 | 0101 |
| -5 | 1011 | 4 | 0100 |
| -4 | 1100 | 3 | 0011 |
| -3 | 1101 | 2 | 0010 |
| -2 | 1110 | 1 | 0001 |
| -1 | 1111 | 0 | 0000 |
Operators
| operator | name | what it does | example | sample property / usage |
|---|---|---|---|---|
| ~ | complement | switch each 0 to 1 and each 1 to 0 | ~0101 = 1010 | ~x = -x - 1 and ~(x - 1) = -x |
| & | and | 1 iff both bits are 1 else 0 | 0110 & 0101 = 0100 | x & - x to extract last bit, x & (x - 1) to clear last bit |
| | | or | 0 iff both bits are 0 else 1 | 0110 | 0101 = 0111 | flags |= x to set the flag |
| ^ | xor (eXclusive OR) | 1 iff only one bit is 1 else 0 | 0110 ^ 0101 = 0011 | 0 ^ x = x, x ^ x = 0 simple checksum reduce(operator.xor, words, 0) |
| « | left shift | shift bits to left | 0011 « 2 = 1100 | x << y is \(x \times 2^y\) |
| » | right shift | shift bits to right | 0110 » 2 = 0001 | x >> y is \(\lfloor{x \div 2^y}\rfloor\) |
Usages
- Set a bit at a position
def set_bit(x, pos):
mask = 1 << pos
return x | mask
- Clear a bit at a position
def clear_bit(x, pos):
mask = ~(1 << pos)
return x & mask
- Clear leading bits from position
def clear_leading_bits(x, pos):
mask = (1 << pos) - 1
return x & mask
- Clear trailing bits after position
def clear_trailing_bits(x, pos):
mask = (1 << 31) - 1 << pos
return x & mask
- Flip a bit at position
def flip_bit(x, pos):
mask = 1 << pos
return x ^ mask
- Check a bit at position
def check_bit(x, pos):
return x >> pos & 1
- Check number is even
def check_even(x):
return (x & 1) == 0
- Check number is power of 2
def check_pow_2(x):
return x & (x - 1) == 0
- Check two numbers are of opposite sign
def check_opposite_sign(x, y):
return x ^ y < 0
- Swap integers the bit manipulation way
def swap(x, y):
x = x ^ y
y = x ^ y
x = x ^ y
return x, y