# std::has_single_bit

< cpp‎ | numeric

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

检查 `x` 是否为二的整数次幂。

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

### 返回值

若 `x` 为二的整数次幂则为 true ；否则为 false 。

### 可能的实现

版本一
    template <std::unsigned_integral T>
        requires !std::same_as<T, bool> && !std::same_as<T, char> &&
                 !std::same_as<T, char8_t> && !std::same_as<T, char16_t> &&
                 !std::same_as<T, char32_t> && !std::same_as<T, wchar_t>
    constexpr bool has_single_bit(T x) noexcept
    {
        return x != 0 && (x & (x - 1)) == 0;
    }
版本二
    template <std::unsigned_integral T>
        requires !std::same_as<T, bool> && !std::same_as<T, char> &&
                 !std::same_as<T, char8_t> && !std::same_as<T, char16_t> &&
                 !std::same_as<T, char32_t> && !std::same_as<T, wchar_t>
    constexpr bool has_single_bit(T x) noexcept
    {
        return std::popcount(x) == 1;
    }

### 示例

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

    int main()
    {
        std::cout << std::boolalpha;
        for (auto i = 0u; i < 10u; ++i) {
            std::cout << "has_single_bit( " << std::bitset<4>(i) << " ) = "
                      << std::has_single_bit(i) // P1956R1 前为 `ispow2`
                      << '\n';
        }
    }

输出：

    has_single_bit( 0000 ) = false
    has_single_bit( 0001 ) = true
    has_single_bit( 0010 ) = true
    has_single_bit( 0011 ) = false
    has_single_bit( 0100 ) = true
    has_single_bit( 0101 ) = false
    has_single_bit( 0110 ) = false
    has_single_bit( 0111 ) = false
    has_single_bit( 1000 ) = true
    has_single_bit( 1001 ) = false

### 参阅

popcount (C++20) | 计量无符号整数中为 1 的位的数量 (函数模板)
count | 返回设置为 true 的位的数量 (`std::bitset<N>` 的公开成员函数)
test | 访问特定位 (`std::bitset<N>` 的公开成员函数)