Espacios de nombres
Variantes

std::has_single_bit

De cppreference.com
 
 
 
<tbody> </tbody>
Definido en el archivo de encabezado <bit>
template< class T > constexpr bool has_single_bit(T x) noexcept;
(desde C++20)

Comprueba si x es una potencia entera de dos.

Esta sobrecarga solo participa en la resolución de sobrecargas si T es un tipo entero sin signo (es decir, unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long, o un tipo entero sin signo extendido).

Valor de retorno

true si x es una potencia entera de dos; de lo contrario false.

Posible implementación

Primera versión
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;
}
Segunda versión
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; 
}

Ejemplo

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

int main()
{
    std::cout << std::boolalpha