Regina 7.4 Calculation Engine
|
An optimised class for bitwise analysis and manipulation of native data types. More...
#include <utilities/bitmanip.h>
Static Public Member Functions | |
static constexpr int | bits (T x) |
Returns the number of bits that are set to 1 in the given integer. | |
static constexpr int | firstBit (T x) |
Returns the index of the first true bit in the given integer, or -1 if the given integer is zero. | |
static constexpr int | lastBit (T x) |
Returns the index of the last true bit in the given integer, or -1 if the given integer is zero. | |
static constexpr T | swapBits (T x, int index0, int index1) |
Returns a copy of the given integer with two bits swapped. | |
static std::partial_ordering | subsetComparison (T x, T y) |
Compares the bits of two integers under the subset relation. | |
static T | nextPermutation (T x) |
Returns the next largest integer with the same number of true bits as x. | |
Static Public Attributes | |
static constexpr bool | specialised = false |
Indicates whether this class is a template specialisation with extra optimisations. | |
An optimised class for bitwise analysis and manipulation of native data types.
The class BitManipulator<T> is used to manipulate an integer of type T as a sequence of bits. Here T must be an unsigned native integer type such as unsigned char, unsigned int, or unsigned long long.
Whilst BitManipulator has a generic implementation, all or most native types T have template specialisations that are carefully optimised (precisely what gets specialised depends upon properties of the compiler).
|
inlinestaticconstexpr |
Returns the number of bits that are set to 1 in the given integer.
The implementation uses std::popcount()
where possible, and a hand-rolled implementation where std::popcount()
might be unavailable (e.g., for 128-bit integers).
x | the integer of type T to examine. |
|
inlinestaticconstexpr |
Returns the index of the first true
bit in the given integer, or -1 if the given integer is zero.
Bits are indexed from 0 upwards, starting at the least significant bit.
x | the integer of type T to examine. |
true
bit, or -1 if there are no true
bits.
|
inlinestaticconstexpr |
Returns the index of the last true
bit in the given integer, or -1 if the given integer is zero.
Bits are indexed from 0 upwards, starting at the least significant bit.
x | the integer of type T to examine. |
true
bit, or -1 if there are no true
bits.
|
inlinestaticinherited |
Returns the next largest integer with the same number of true
bits as x.
If x is the largest such integer (i.e., x is of the form 111...1000...0), then this routine returns 0.
x | the integer of type T to examine. |
true
bits, or 0 if this is the largest such integer.
|
inlinestatic |
Compares the bits of two integers under the subset relation.
Here x is considered less than y if the bits that are set in x form a strict subset of the bits that are set in y.
std::partial_ordering
, and since there is no "natural" way to present a partial ordering as an integer.x | the first integer to examine. |
y | the second integer to examine. |
equivalent
, less
, greater
, and unordered
respectively.
|
inlinestaticconstexpr |
Returns a copy of the given integer with two bits swapped.
Bits are indexed from 0 upwards, starting at the least significant bit.
The two indices index0 and index1 may be the same (in which case the given bitmask will be returned unchanged).
x | the bitmask to examine. |
index0 | the index of the first bit to swap. |
index1 | the index of the second bit to swap. |
|
staticconstexprinherited |
Indicates whether this class is a template specialisation with extra optimisations.
This compile-time constant is set to false
for the generic implementation, and true
for all specialisations.