P99

Bit fiddling of low order bits. More...
Macros  
#define  P99_LOW0SET(X) ((X)  ((X) + 1)) 
set least significant zero bit More...  
#define  P99_LOW2(X) ((X) & (X)) 
extract the least significant bit that is non zero More...  
#define  P99_LOW2CLEAR(X) ((X) & ((X)  1)) 
clear the least significant bit that is non zero More...  
#define  P99_LOW2FILL(X) ((X)  ((X)  1)) 
fill all bits below least significant bit that is non zero More...  
#define  P99_LOW2MASK0(X) (~(X) & ((X)  1)) 
mask consisting of bits below and including the least significant bit that is non zero More...  
#define  P99_LOW2MASK1(X) ((X) ^ ((X)  1)) 
mask consisting of bits strictly below the least significant bit that is non zero More...  
#define  P99_LOW2SHIFT(X) (P99_LIKELY(!!(X)) ? ((X) / ((X) & (X))) : 0u) 
shift number right such that the least significant bit that is non zero ends up at bit position 0 More...  
#define  P99_MASK2LOW0(X) ((X) ^ (X)) 
mask consisting of bits strictly above the least significant bit that is non zero More...  
#define  P99_MASK2LOW1(X) ((X)  (X)) 
mask consisting of bits above and including the least significant bit that is non zero More...  
Functions  
uintmax_t  p99_low0set (uintmax_t p00_x) 
function equivalent to P99_LOW0SET More...  
uintmax_t  p99_low2 (uintmax_t p00_x) 
function equivalent to P99_LOW2 More...  
uintmax_t  p99_low2clear (uintmax_t p00_x) 
function equivalent to P99_LOW2CLEAR More...  
uintmax_t  p99_low2fill (uintmax_t p00_x) 
function equivalent to P99_LOW2FILL More...  
uintmax_t  p99_low2mask0 (uintmax_t p00_x) 
function equivalent to P99_LOW2MASK0 More...  
uintmax_t  p99_low2mask1 (uintmax_t p00_x) 
function equivalent to P99_LOW2MASK1 More...  
uintmax_t  p99_low2shift (uintmax_t p00_x) 
function equivalent to P99_LOW2SHIFT More...  
uintmax_t  p99_mask2low0 (uintmax_t p00_x) 
function equivalent to P99_MASK2LOW0 More...  
uintmax_t  p99_mask2low1 (uintmax_t p00_x) 
function equivalent to P99_MASK2LOW1 More...  
uintmax_t  p99_next_popcount (uintmax_t p00_x) 
function that returns the next higher value that has exactly the same popcount as x. More...  
Bit fiddling of low order bits.
The smart expression used in this group are taken as summarized in Christer Ericson's blog.
They work because of the special features of unsigned integer arithmetic that it is arithmetic modulo a power of 2
.
The notation of the macro and function names has some menomics:
low2
stands for the least significant bit resulting in the corresponding power of 2, something like 1 << bitposition
mask
stands for a mask that is constructed from this, that is a sequence of bits that are all one. When mask
comes after low
as in low2mask
it means that the bit mask follows that least significant bit. When mask
comes before low
as in mask2low
it means that the bit mask precedes that least significant bit.0
or 1
indicates whether that least significant bit is cleared or left untouched.Be careful when using the macros in this group:
On the other hand prefer the macro when you known that you have compile time expressions. Then you may even use them as part of an #
if
preprocessing conditional.