C Programming - Bit Twiddling Hack
Some Bit Twiddling code snippets!!Bit Twiddling Hacks
Contents:
# Compute the sign of an integer
# Compute the integer absolute value (abs) without branching
# Compute the minimum (min) or maximum (max) of two integers without branching
# Determining if an integer is a power of 2
# Sign extending
* Sign extending from a constant bit width
* Sign extending from a variable bit-width
* Sign extending from a variable bit-width in 3 operations
# Conditionally set or clear bits without branching
# Merge bits from two values according to a mask
# Counting bits set
* Counting bits set, naive way
* Counting bits set by lookup table
* Counting bits set, Brian Kernighan's way
* Counting bits set in 12, 24, or 32-bit words using 64-bit instructions
* Counting bits set, in parallel
# Computing parity (1 if an odd number of bits set, 0 otherwise)
* Compute parity of a word the naive way
* Compute parity by lookup table
* Compute parity of a byte using 64-bit multiply and modulus division
* Compute parity in parallel
# Swapping Values
* Swapping values with XOR
* Swapping individual bits with XOR
# Reversing bit sequences
* Reverse bits the obvious way
* Reverse bits in word by lookup table
* Reverse the bits in a byte with 3 operations (64-bit muliply and modulus division)
* Reverse the bits in a byte with 4 operations (64-bit multiply, no division)
* Reverse the bits in a byte with 7 operations (no 64-bit, only 32)
* Reverse an N-bit quantity in parallel with 5 * lg(N) operations
# Modulus division (aka computing remainders)
* Computing modulus division by 1 << s without a division operation (obvious)
* Computing modulus division by (1 << s) - 1 without a division operation
* Computing modulus division by (1 << s) - 1 in parallel without a division operation
# Finding integer log base 2 of an integer (aka the position of the highest bit set)
* Find the log base 2 of an integer with the MSB N set in O(N) operations (the obvious way)
* Find the integer log base 2 of an integer with an 64-bit IEEE float
* Find the log base 2 of an integer with a lookup table
* Find the log base 2 of an N-bit integer in O(lg(N)) operations
* Find the log base 2 of an N-bit integer in O(lg(N)) operations with multiply and lookup
# Find integer log base 10 of an integer
# Find integer log base 2 of a 32-bit IEEE float
# Find integer log base 2 of the pow(2, r)-root of a 32-bit IEEE float (for unsigned integer r)
# Counting consecutive trailing zero bits (or finding bit indices)
* Count the consecutive zero bits (trailing) on the right in parallel
* Count the consecutive zero bits (trailing) on the right by binary search
* Count the consecutive zero bits (trailing) on the right by casting to a float
* Count the consecutive zero bits (trailing) on the right with modulus division and lookup
* Count the consecutive zero bits (trailing) on the right with multiply and lookup
# Round up to the next highest power of 2 by float casting
# Round up to the next highest power of 2
# Interleaving bits (aka computing Morton Numbers)
* Interleave bits the obvious way
* Interleave bits by table lookup
* Interleave bits with 64-bit multiply
* Interleave bits by Binary Magic Numbers
# Testing for ranges of bytes in a word (and counting occurances found)
* Determine if a word has a zero byte
* Determine if a word has byte less than n
* Determine if a word has a byte greater than n
* Determine if a word has a byte between m and n
Bit Twiddling Hacks
Labels: C
About this entry
You’re currently reading “
- Published:
- 9:13 pm
- by -
0 Comments (Post a Comment)