#include <sys/stdbit.h>
#ifndef _KERNEL
#include <limits.h>
#else
#include <sys/types.h>
#endif
unsigned int
stdc_leading_zeros_uc(unsigned char uc)
{
if (uc == 0) {
return (CHAR_BIT * sizeof (unsigned char));
}
return (__builtin_clz(uc) -
(sizeof (unsigned int) - sizeof (unsigned char)) * CHAR_BIT);
}
unsigned int
stdc_leading_zeros_us(unsigned short us)
{
if (us == 0) {
return (CHAR_BIT * sizeof (unsigned short));
}
return (__builtin_clz(us) -
(sizeof (unsigned int) - sizeof (unsigned short)) * CHAR_BIT);
}
unsigned int
stdc_leading_zeros_ui(unsigned int ui)
{
if (ui == 0) {
return (CHAR_BIT * sizeof (unsigned int));
}
return (__builtin_clz(ui));
}
unsigned int
stdc_leading_zeros_ul(unsigned long ul)
{
if (ul == 0) {
return (CHAR_BIT * sizeof (unsigned long));
}
return (__builtin_clzl(ul));
}
unsigned int
stdc_leading_zeros_ull(unsigned long long ull)
{
if (ull == 0) {
return (CHAR_BIT * sizeof (unsigned long long));
}
return (__builtin_clzll(ull));
}
unsigned int
stdc_leading_ones_uc(unsigned char uc)
{
return (stdc_leading_zeros_uc(~uc));
}
unsigned int
stdc_leading_ones_us(unsigned short us)
{
return (stdc_leading_zeros_us(~us));
}
unsigned int
stdc_leading_ones_ui(unsigned int ui)
{
return (stdc_leading_zeros_ui(~ui));
}
unsigned int
stdc_leading_ones_ul(unsigned long ul)
{
return (stdc_leading_zeros_ul(~ul));
}
unsigned int
stdc_leading_ones_ull(unsigned long long ull)
{
return (stdc_leading_zeros_ull(~ull));
}
unsigned int
stdc_trailing_zeros_uc(unsigned char uc)
{
if (uc == 0) {
return (CHAR_BIT * sizeof (unsigned char));
}
return (__builtin_ctz(uc));
}
unsigned int
stdc_trailing_zeros_us(unsigned short us)
{
if (us == 0) {
return (CHAR_BIT * sizeof (unsigned short));
}
return (__builtin_ctz(us));
}
unsigned int
stdc_trailing_zeros_ui(unsigned int ui)
{
if (ui == 0) {
return (CHAR_BIT * sizeof (unsigned int));
}
return (__builtin_ctz(ui));
}
unsigned int
stdc_trailing_zeros_ul(unsigned long ul)
{
if (ul == 0) {
return (CHAR_BIT * sizeof (unsigned long));
}
return (__builtin_ctzl(ul));
}
unsigned int
stdc_trailing_zeros_ull(unsigned long long ull)
{
if (ull == 0) {
return (CHAR_BIT * sizeof (unsigned long long));
}
return (__builtin_ctzll(ull));
}
unsigned int
stdc_trailing_ones_uc(unsigned char uc)
{
return (stdc_trailing_zeros_uc(~uc));
}
unsigned int
stdc_trailing_ones_us(unsigned short us)
{
return (stdc_trailing_zeros_us(~us));
}
unsigned int
stdc_trailing_ones_ui(unsigned int ui)
{
return (stdc_trailing_zeros_ui(~ui));
}
unsigned int
stdc_trailing_ones_ul(unsigned long ul)
{
return (stdc_trailing_zeros_ul(~ul));
}
unsigned int
stdc_trailing_ones_ull(unsigned long long ull)
{
return (stdc_trailing_zeros_ull(~ull));
}
unsigned int
stdc_first_leading_zero_uc(unsigned char uc)
{
if (uc == UCHAR_MAX) {
return (0);
}
return (stdc_leading_ones_uc(uc) + 1);
}
unsigned int
stdc_first_leading_zero_us(unsigned short us)
{
if (us == USHRT_MAX) {
return (0);
}
return (stdc_leading_ones_us(us) + 1);
}
unsigned int
stdc_first_leading_zero_ui(unsigned int ui)
{
if (ui == UINT_MAX) {
return (0);
}
return (stdc_leading_ones_ui(ui) + 1);
}
unsigned int
stdc_first_leading_zero_ul(unsigned long ul)
{
if (ul == ULONG_MAX) {
return (0);
}
return (stdc_leading_ones_ul(ul) + 1);
}
unsigned int
stdc_first_leading_zero_ull(unsigned long long ull)
{
if (ull == ULLONG_MAX) {
return (0);
}
return (stdc_leading_ones_ull(ull) + 1);
}
unsigned int
stdc_first_leading_one_uc(unsigned char uc)
{
if (uc == 0) {
return (0);
}
return (stdc_leading_zeros_uc(uc) + 1);
}
unsigned int
stdc_first_leading_one_us(unsigned short us)
{
if (us == 0) {
return (0);
}
return (stdc_leading_zeros_us(us) + 1);
}
unsigned int
stdc_first_leading_one_ui(unsigned int ui)
{
if (ui == 0) {
return (0);
}
return (stdc_leading_zeros_ui(ui) + 1);
}
unsigned int
stdc_first_leading_one_ul(unsigned long ul)
{
if (ul == 0) {
return (0);
}
return (stdc_leading_zeros_ul(ul) + 1);
}
unsigned int
stdc_first_leading_one_ull(unsigned long long ull)
{
if (ull == 0) {
return (0);
}
return (stdc_leading_zeros_ull(ull) + 1);
}
unsigned int
stdc_first_trailing_zero_uc(unsigned char uc)
{
if (uc == UCHAR_MAX) {
return (0);
}
return (stdc_trailing_ones_uc(uc) + 1);
}
unsigned int
stdc_first_trailing_zero_us(unsigned short us)
{
if (us == USHRT_MAX) {
return (0);
}
return (stdc_trailing_ones_us(us) + 1);
}
unsigned int
stdc_first_trailing_zero_ui(unsigned int ui)
{
if (ui == UINT_MAX) {
return (0);
}
return (stdc_trailing_ones_ui(ui) + 1);
}
unsigned int
stdc_first_trailing_zero_ul(unsigned long ul)
{
if (ul == ULONG_MAX) {
return (0);
}
return (stdc_trailing_ones_ul(ul) + 1);
}
unsigned int
stdc_first_trailing_zero_ull(unsigned long long ull)
{
if (ull == ULLONG_MAX) {
return (0);
}
return (stdc_trailing_ones_ull(ull) + 1);
}
unsigned int
stdc_first_trailing_one_uc(unsigned char uc)
{
if (uc == 0) {
return (0);
}
return (stdc_trailing_zeros_uc(uc) + 1);
}
unsigned int
stdc_first_trailing_one_us(unsigned short us)
{
if (us == 0) {
return (0);
}
return (stdc_trailing_zeros_us(us) + 1);
}
unsigned int
stdc_first_trailing_one_ui(unsigned int ui)
{
if (ui == 0) {
return (0);
}
return (stdc_trailing_zeros_ui(ui) + 1);
}
unsigned int
stdc_first_trailing_one_ul(unsigned long ul)
{
if (ul == 0) {
return (0);
}
return (stdc_trailing_zeros_ul(ul) + 1);
}
unsigned int
stdc_first_trailing_one_ull(unsigned long long ull)
{
if (ull == 0) {
return (0);
}
return (stdc_trailing_zeros_ull(ull) + 1);
}
unsigned int
stdc_count_zeros_uc(unsigned char uc)
{
return (CHAR_BIT * sizeof (unsigned char) - __builtin_popcount(uc));
}
unsigned int
stdc_count_zeros_us(unsigned short us)
{
return (CHAR_BIT * sizeof (unsigned short) - __builtin_popcount(us));
}
unsigned int
stdc_count_zeros_ui(unsigned int ui)
{
return (CHAR_BIT * sizeof (unsigned int) - __builtin_popcount(ui));
}
unsigned int
stdc_count_zeros_ul(unsigned long ul)
{
return (CHAR_BIT * sizeof (unsigned long) - __builtin_popcountl(ul));
}
unsigned int
stdc_count_zeros_ull(unsigned long long ull)
{
return (CHAR_BIT * sizeof (unsigned long long) -
__builtin_popcountll(ull));
}
unsigned int
stdc_count_ones_uc(unsigned char uc)
{
return (__builtin_popcount(uc));
}
unsigned int
stdc_count_ones_us(unsigned short us)
{
return (__builtin_popcount(us));
}
unsigned int
stdc_count_ones_ui(unsigned int ui)
{
return (__builtin_popcount(ui));
}
unsigned int
stdc_count_ones_ul(unsigned long ul)
{
return (__builtin_popcountl(ul));
}
unsigned int
stdc_count_ones_ull(unsigned long long ull)
{
return (__builtin_popcountll(ull));
}
bool
stdc_has_single_bit_uc(unsigned char uc)
{
return (stdc_count_ones_uc(uc) == 1);
}
bool
stdc_has_single_bit_us(unsigned short us)
{
return (stdc_count_ones_us(us) == 1);
}
bool
stdc_has_single_bit_ui(unsigned int ui)
{
return (stdc_count_ones_ui(ui) == 1);
}
bool
stdc_has_single_bit_ul(unsigned long ul)
{
return (stdc_count_ones_ul(ul) == 1);
}
bool
stdc_has_single_bit_ull(unsigned long long ull)
{
return (stdc_count_ones_ull(ull) == 1);
}
unsigned int
stdc_bit_width_uc(unsigned char uc)
{
if (uc == 0) {
return (0);
}
return (CHAR_BIT * sizeof (unsigned char) + 1 -
stdc_first_leading_one_uc(uc));
}
unsigned int
stdc_bit_width_us(unsigned short us)
{
if (us == 0) {
return (0);
}
return (CHAR_BIT * sizeof (unsigned short) + 1 -
stdc_first_leading_one_us(us));
}
unsigned int
stdc_bit_width_ui(unsigned int ui)
{
if (ui == 0) {
return (0);
}
return (CHAR_BIT * sizeof (unsigned int) + 1 -
stdc_first_leading_one_ui(ui));
}
unsigned int
stdc_bit_width_ul(unsigned long ul)
{
if (ul == 0) {
return (0);
}
return (CHAR_BIT * sizeof (unsigned long) + 1 -
stdc_first_leading_one_ul(ul));
}
unsigned int
stdc_bit_width_ull(unsigned long long ull)
{
if (ull == 0) {
return (0);
}
return (CHAR_BIT * sizeof (unsigned long long) + 1 -
stdc_first_leading_one_ull(ull));
}
unsigned char
stdc_bit_floor_uc(unsigned char uc)
{
if (uc == 0) {
return (0);
}
return (1U << (stdc_bit_width_uc(uc) - 1));
}
unsigned short
stdc_bit_floor_us(unsigned short us)
{
if (us == 0) {
return (0);
}
return (1U << (stdc_bit_width_us(us) - 1));
}
unsigned int
stdc_bit_floor_ui(unsigned int ui)
{
if (ui == 0) {
return (0);
}
return (1U << (stdc_bit_width_ui(ui) - 1));
}
unsigned long
stdc_bit_floor_ul(unsigned long ul)
{
if (ul == 0) {
return (0);
}
return (1UL << (stdc_bit_width_ul(ul) - 1));
}
unsigned long long
stdc_bit_floor_ull(unsigned long long ull)
{
if (ull == 0) {
return (0);
}
return (1ULL << (stdc_bit_width_ull(ull) - 1));
}
unsigned char
stdc_bit_ceil_uc(unsigned char uc)
{
if (uc <= 1) {
return (1);
}
return (2U << (stdc_bit_width_uc(uc - 1) - 1));
}
unsigned short
stdc_bit_ceil_us(unsigned short us)
{
if (us <= 1) {
return (1);
}
return (2U << (stdc_bit_width_us(us - 1) - 1));
}
unsigned int
stdc_bit_ceil_ui(unsigned int ui)
{
if (ui <= 1) {
return (1);
}
return (2U << (stdc_bit_width_ui(ui - 1) - 1));
}
unsigned long
stdc_bit_ceil_ul(unsigned long ul)
{
if (ul <= 1) {
return (1);
}
return (2UL << (stdc_bit_width_ul(ul - 1) - 1));
}
unsigned long long
stdc_bit_ceil_ull(unsigned long long ull)
{
if (ull <= 1) {
return (1);
}
return (2ULL << (stdc_bit_width_ull(ull - 1) - 1));
}