libbittwiddle
libbittwiddle copied to clipboard
A collection of bit manipulation routines for C++
What is libbittwiddle
Libbittwiddle is a collection of bit manipulation routines.
The included routines are as follows:
-
popcnt
Computes set bits. Uses a compiler intrinsic if available. Results in 12 arithmetic operations, no branches.
-
clz
Computes leading zeros. Uses a compiler intrinsic if available. Results in 23-25 arithmetic operations, no branches.
-
ctz
Computes trailing zeros. Uses a compiler intrinsic if available. Results in 16 arithmetic operations, no branches.
-
check_has_byte_eq
Checks whether a number has a byte with a value equal to a value x. Results in 5 arithmetic operations, no branches.
-
check_has_byte_lt
Checks whether a number has a byte with a value less than a value x. It's possible to select from two implementations with the following performance characteristics: 4-5 arithmetic operations and a branch (default). 14-15 arithmetic operations and no branches.
If the value x is known at compile-time, both implementations are equivalent and result in 4-5 arithmetic operations and no branches.
The branchless implementation can be selected by defining LIBBITTWIDDLE_BRANCHLESS_CHECK_HAS_LTGT before including libbittwiddle.h
-
check_has_byte_gt
Checks whether a number has a byte with a value greater than a value x. It's possible to select from two implementations with the following performance characteristics: 3-4 arithmetic operations and a branch (default). 14-15 arithmetic operations and no branches.
If the value x is known at compile-time, both implementations are equivalent and result in 3-4 arithmetic operations and no branches.
The branchless implementation can be selected by defining LIBBITTWIDDLE_BRANCHLESS_CHECK_HAS_LTGT before including libbittwiddle.h
-
check_has_byte_between
Checks whether a number has a byte with a value between compile-time values x and y. Results in 7 arithmetic operations and no branches (the range of x and y is restricted).
A C++11-aware compiler is required.