# std::bit_width

< cpp‎ | numeric

定义于头文件 `<bit>` |  |
template< class T > constexpr T bit_width(T x) noexcept; |  | (C++20 起)

若 `x` 非零，则计算存储值 `x` 所需的位数，即 \(1 + \lfloor \log_2(x) \rfloor\)1 + floor(log
2(x)) 。若 `x` 为零，则返回零。

此重载仅若 `T` 为无符号整数类型（即 unsigned char 、 unsigned short 、 unsigned int 、 unsigned long 、 unsigned long long 或扩展无符号整数类型）才参与重载决议。

### 返回值

若 `x` 为零则为零；否则为一加 `x` 的 2 为底的对数，舍弃任何小数部分。

### 注解

此函数等价于 return std::numeric_limits<T>::digits - std::countl_zero(x); 。

### 示例

    #include <bit>
    #include <bitset>
    #include <iostream>

    auto main() -> int
    {
        for (unsigned x{0u}; x != 8u; ++x)
        {
            std::cout
                << "bit_width( "
                << std::bitset<4>{x} << " ) = "
                << std::bit_width(x) << '\n';
        }
    }

输出：

    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

### 参阅

countl_zero (C++20) | 从最高位起计量连续的 0 位的数量 (函数模板)