std::has_single_bit(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

✨ std::has_single_bit(3) ✨

okay so this is the C++ Standard Libary manual page for std::has_single_bit, and it is lowkey giving bit-nerd main character energy πŸ’…. We are checking whether a number is an integral power of two, and the vibe check is immaculate. no cap.


🌸 NAME 🌸

std::has_single_bit β€” std::has_single_bit (yes bestie, that is the whole name, iconic minimalism πŸ’€)


✨ Synopsis ✨

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

Checks if x is an integral power of two. 🫢

This overload participates in overload resolution only if T is an unsigned integer type (that is, unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long, or an extended unsigned integer type).


πŸŽ€ Parameters πŸŽ€

  • x β€” value of unsigned integer type.

πŸ’– Return value πŸ’–

true if x is an integral power of two; otherwise false.


🧚 Notes 🧚

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

πŸ‘‘ Possible implementation πŸ‘‘

First version

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 && !(x & (x - 1));
}

Second version

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;
}

πŸ¦‹ Example πŸ¦‹

// Run this code

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

int main()
{
    for (auto u = 0u; u != 10; ++u)
    {
        std::cout << "u = " << u << " = " << std::bitset<4>(u);
        if (std::has_single_bit(u)) // `ispow2` before P1956R1
            std::cout << " = 2^" << std::log2(u) << " (is power of two)";
        std::cout << '\n';
    }
}

🌸 Output: 🌸

u = 0 = 0000
u = 1 = 0001 = 2^0 (is power of two)
u = 2 = 0010 = 2^1 (is power of two)
u = 3 = 0011
u = 4 = 0100 = 2^2 (is power of two)
u = 5 = 0101
u = 6 = 0110
u = 7 = 0111
u = 8 = 1000 = 2^3 (is power of two)
u = 9 = 1001

🌈 See also 🌈

  • popcount β€” counts the number of 1 bits in an unsigned integer (C++20) (function template)
  • count β€” returns the number of bits set to true (public member function of std::bitset<N>)
  • test β€” accesses specific bit (public member function of std::bitset<N>)

that's a wrap, bestie! source/version: http://cppreference.com Β· date: 2024.06.10 Β· page: std::has_single_bit(3) πŸ’œβœ¨ periodt.

πŸ“¦ where this page comes from