From cppreference.com
Defined in header
template<classT>constexprboolhas_single_bit(Tx)noexcept;(since C++20)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, unsignedchar, unsignedshort, unsignedint, unsignedlong, unsignedlonglong, 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
Prior to
, the proposed name for this function template was ispow2.
macroValueStdFeature
(C++20)
Integral power-of-2 operations
Possible implementation
template<typenameT,typename...U>conceptneither=(!std::same_as<T,U>&&...);template<std::unsigned_integralT>requiresneither<T,bool,char,char8_t,char16_t,char32_t,wchar_t>constexprboolhas_single_bit(Tx)noexcept{returnstd::popcount(x)==1;}Example
Run this code
#include<bit>#include<bitset>#include<cmath>#include<iostream>intmain(){for(autou{0u};u!=0B1010;++u){std::cout<<"u = "<<u<<" = "<<std::bitset<4>(u);if(std::has_single_bit(u))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
(C++20)
counts the number of 1 bits in an unsigned integer
(function template)
returns the number of bits set to true
(public member function of std::bitset<N>)
accesses specific bit
(public member function of std::bitset<N>)