Bit Manipulation
****************

This chapter contains information about functions and macros for determining the endianness of integer types and manipulating the bits of unsigned integers.  These functions and macros are from ISO C23 and are declared in the header file stdbit.h.

The following macros describe the endianness of integer types.  They have values that are integer constant expressions.

 -- Macro: __STDC_ENDIAN_LITTLE__
     This macro represents little-endian storage.

 -- Macro: __STDC_ENDIAN_BIG__
     This macro represents big-endian storage.

 -- Macro: __STDC_ENDIAN_NATIVE__
     This macro equals __STDC_ENDIAN_LITTLE__ if integer types are stored in memory in little-endian format, and equals __STDC_ENDIAN_BIG__ if integer types are stored in memory in big-endian format.

The following functions manipulate the bits of unsigned integers. Each function family has functions for the types unsigned char, unsigned short, unsigned int, unsigned long int and unsigned long long int.  In addition, there is a corresponding type-generic macro (not listed below), named the same as the functions but without any suffix such as _uc.  The type-generic macro can only be used with an argument of an unsigned integer type with a width of 8, 16, 32 or 64 bits, or when using a compiler with support for __builtin_stdc_bit_ceil (https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html), etc., built-in functions such as GCC 14.1 or later any unsigned integer type those built-in functions support. In GCC 14.1 that includes support for unsigned __int128 and unsigned _BitInt(N) if supported by the target.

 -- Function: unsigned int stdc_leading_zeros_uc (unsigned char X)
 -- Function: unsigned int stdc_leading_zeros_us (unsigned short X)
 -- Function: unsigned int stdc_leading_zeros_ui (unsigned int X)
 -- Function: unsigned int stdc_leading_zeros_ul (unsigned long int X)
 -- Function: unsigned int stdc_leading_zeros_ull (unsigned long long int X)
     C23, stdbit.h The stdc_leading_zeros functions count the number of leading (most significant) zero bits in X, starting from the most significant bit of the argument type.  If X is zero, they return the width of X in bits.

 -- Function: unsigned int stdc_leading_ones_uc (unsigned char X)
 -- Function: unsigned int stdc_leading_ones_us (unsigned short X)
 -- Function: unsigned int stdc_leading_ones_ui (unsigned int X)
 -- Function: unsigned int stdc_leading_ones_ul (unsigned long int X)
 -- Function: unsigned int stdc_leading_ones_ull (unsigned long long int X)
     C23, stdbit.h The stdc_leading_ones functions count the number of leading (most significant) one bits in X, starting from the most significant bit of the argument type.

 -- Function: unsigned int stdc_trailing_zeros_uc (unsigned char X)
 -- Function: unsigned int stdc_trailing_zeros_us (unsigned short X)
 -- Function: unsigned int stdc_trailing_zeros_ui (unsigned int X)
 -- Function: unsigned int stdc_trailing_zeros_ul (unsigned long int X)
 -- Function: unsigned int stdc_trailing_zeros_ull (unsigned long long int X)
     C23, stdbit.h The stdc_trailing_zeros functions count the number of trailing (least significant) zero bits in X, starting from the least significant bit of the argument type.  If X is zero, they return the width of X in bits.

 -- Function: unsigned int stdc_trailing_ones_uc (unsigned char X)
 -- Function: unsigned int stdc_trailing_ones_us (unsigned short X)
 -- Function: unsigned int stdc_trailing_ones_ui (unsigned int X)
 -- Function: unsigned int stdc_trailing_ones_ul (unsigned long int X)
 -- Function: unsigned int stdc_trailing_ones_ull (unsigned long long int X)
     C23, stdbit.h The stdc_trailing_ones functions count the number of trailing (least significant) one bits in X, starting from the least significant bit of the argument type.

 -- Function: unsigned int stdc_first_leading_zero_uc (unsigned char X)
 -- Function: unsigned int stdc_first_leading_zero_us (unsigned short X)
 -- Function: unsigned int stdc_first_leading_zero_ui (unsigned int X)
 -- Function: unsigned int stdc_first_leading_zero_ul (unsigned long int X)
 -- Function: unsigned int stdc_first_leading_zero_ull (unsigned long long int X)
     C23, stdbit.h The stdc_first_leading_zero functions return the position of the most significant zero bit in X, counting from the most significant bit of X as 1, or zero if there is no zero bit in X.

 -- Function: unsigned int stdc_first_leading_one_uc (unsigned char X)
 -- Function: unsigned int stdc_first_leading_one_us (unsigned short X)
 -- Function: unsigned int stdc_first_leading_one_ui (unsigned int X)
 -- Function: unsigned int stdc_first_leading_one_ul (unsigned long int X)
 -- Function: unsigned int stdc_first_leading_one_ull (unsigned long long int X)
     C23, stdbit.h The stdc_first_leading_one functions return the position of the most significant one bit in X, counting from the most significant bit of X as 1, or zero if there is no one bit in X.

 -- Function: unsigned int stdc_first_trailing_zero_uc (unsigned char X)
 -- Function: unsigned int stdc_first_trailing_zero_us (unsigned short X)
 -- Function: unsigned int stdc_first_trailing_zero_ui (unsigned int X)
 -- Function: unsigned int stdc_first_trailing_zero_ul (unsigned long int X)
 -- Function: unsigned int stdc_first_trailing_zero_ull (unsigned long long int X)
     C23, stdbit.h The stdc_first_trailing_zero functions return the position of the least significant zero bit in X, counting from the least significant bit of X as 1, or zero if there is no zero bit in X.

 -- Function: unsigned int stdc_first_trailing_one_uc (unsigned char X)
 -- Function: unsigned int stdc_first_trailing_one_us (unsigned short X)
 -- Function: unsigned int stdc_first_trailing_one_ui (unsigned int X)
 -- Function: unsigned int stdc_first_trailing_one_ul (unsigned long int X)
 -- Function: unsigned int stdc_first_trailing_one_ull (unsigned long long int X)
     C23, stdbit.h The stdc_first_trailing_one functions return the position of the least significant one bit in X, counting from the least significant bit of X as 1, or zero if there is no one bit in X.

 -- Function: unsigned int stdc_count_zeros_uc (unsigned char X)
 -- Function: unsigned int stdc_count_zeros_us (unsigned short X)
 -- Function: unsigned int stdc_count_zeros_ui (unsigned int X)
 -- Function: unsigned int stdc_count_zeros_ul (unsigned long int X)
 -- Function: unsigned int stdc_count_zeros_ull (unsigned long long int X)
     C23, stdbit.h The stdc_count_zeros functions count the number of zero bits in X.

 -- Function: unsigned int stdc_count_ones_uc (unsigned char X)
 -- Function: unsigned int stdc_count_ones_us (unsigned short X)
 -- Function: unsigned int stdc_count_ones_ui (unsigned int X)
 -- Function: unsigned int stdc_count_ones_ul (unsigned long int X)
 -- Function: unsigned int stdc_count_ones_ull (unsigned long long int X)
     C23, stdbit.h The stdc_count_ones functions count the number of one bits in X.

 -- Function: _Bool stdc_has_single_bit_uc (unsigned char X)
 -- Function: _Bool stdc_has_single_bit_us (unsigned short X)
 -- Function: _Bool stdc_has_single_bit_ui (unsigned int X)
 -- Function: _Bool stdc_has_single_bit_ul (unsigned long int X)
 -- Function: _Bool stdc_has_single_bit_ull (unsigned long long int X)
     C23, stdbit.h The stdc_has_single_bit functions return whether X has exactly one bit set to one.

 -- Function: unsigned int stdc_bit_width_uc (unsigned char X)
 -- Function: unsigned int stdc_bit_width_us (unsigned short X)
 -- Function: unsigned int stdc_bit_width_ui (unsigned int X)
 -- Function: unsigned int stdc_bit_width_ul (unsigned long int X)
 -- Function: unsigned int stdc_bit_width_ull (unsigned long long int X)
     C23, stdbit.h The stdc_bit_width functions return the minimum number of bits needed to store X, not counting leading zero bits.  If X is zero, they return zero.

 -- Function: unsigned char stdc_bit_floor_uc (unsigned char X)
 -- Function: unsigned short stdc_bit_floor_us (unsigned short X)
 -- Function: unsigned int stdc_bit_floor_ui (unsigned int X)
 -- Function: unsigned long int stdc_bit_floor_ul (unsigned long int X)
 -- Function: unsigned long long int stdc_bit_floor_ull (unsigned long long int X)
     C23, stdbit.h The stdc_bit_floor functions return the largest integer power of two that is less than or equal to X.  If X is zero, they return zero.

 -- Function: unsigned char stdc_bit_ceil_uc (unsigned char X)
 -- Function: unsigned short stdc_bit_ceil_us (unsigned short X)
 -- Function: unsigned int stdc_bit_ceil_ui (unsigned int X)
 -- Function: unsigned long int stdc_bit_ceil_ul (unsigned long int X)
 -- Function: unsigned long long int stdc_bit_ceil_ull (unsigned long long int X)
     C23, stdbit.h The stdc_bit_ceil functions return the smallest integer power of two that is greater than or equal to X.  If this cannot be represented in the return type, they return zero.