Namespaces
Variants

std::bit_width

From cppreference.com
 
 
Utilities library
General utilities
Relational operators (deprecated in C++20)
Integer comparison functions
(C++20)(C++20)(C++20)    
(C++20)
Swap and type operations
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Common vocabulary types
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
Defined in header <bit>
template< class T >
constexpr int bit_width( T x ) noexcept;
(since C++20)

Calculates the number of bits needed to store the value x, that is, ⌈log2(x + 1)⌉.

Parameters

x - a value whose bit width is to be calculated
Type requirements
T - must be an unsigned integer type (that is, unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long, or an extended unsigned integer type) in order to participate in overload resolution.

Return value

0 if x is 0; otherwise, 1 plus the base-2 logarithm of x, with any fractional part discarded.

Notes

This function is equivalent to return std::numeric_limits<T>::digits - std::countl_zero(x);.

Feature-test macro Value Std Feature
__cpp_lib_int_pow2 202002L (C++20) Integral power-of-2 operations

Example

#include <bit>
#include <bitset>
#include <cstdio>
#include <print>

int main()
{
    for (unsigned x{}; x != 9; ++x)
    {
        if (std::has_single_bit(x))
            std::putchar('\n');
        
        std::print("bit_width({:04b}) = {}\n", x, std::bit_width(x));
    }
}

Output:

bit_width(0000) = 0

bit_width(0001) = 1

bit_width(0010) = 2
bit_width(0011) = 2

bit_width(0100) = 3
bit_width(0101) = 3
bit_width(0110) = 3
bit_width(0111) = 3

bit_width(1000) = 4

Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior
LWG 3656 C++20 the return type of bit_width is the same as the type of its function argument made it int

See also

counts the number of consecutive 0 bits, starting from the most significant bit
(function template) [edit]