在C++17中,有没有办法在编译时生成一个前N位的常量?在伪代码中,我将查找类似于以下内容的内容:
constexpr uint32_t MY_CONSTANT = setBits<2>();
相当于:
constexpr uint32_t MY_CONSTANT = 0b11;
换句话说,给定编译时常数N,返回编译时常数M,其中位0至(N-1)为1(设置)。
abithluo1#
我不认为在标准库中有现成的函数(尽管std::bitset::set从C++23开始就是constexpr)。
std::bitset::set
constexpr
template<class T, std::size_t N> constexpr T setBits() { if constexpr (N == sizeof(unsigned long long) * CHAR_BIT) return ~T{}; else return static_cast<T>((1ull << N) - 1); } constexpr auto MY_CONSTANT = setBits<std::uint32_t, 2>();
setBits<std::uint8_t, 2>()的示例:
setBits<std::uint8_t, 2>()
0b00000001 << 2 ------------- = 0b00000100 0b00000100 - 1 ------------- = 0b00000011
或者对0求反以置位所有位,并右移除N以外的所有位:
0
N
template<class T, std::size_t N> constexpr T setBits() { if constexpr (N == 0) return 0; else return ~T{} >> (sizeof(T) * CHAR_BIT - N); }
1条答案
按热度按时间abithluo1#
我不认为在标准库中有现成的函数(尽管
std::bitset::set
从C++23开始就是constexpr
)。setBits<std::uint8_t, 2>()
的示例:或者对
0
求反以置位所有位,并右移除N
以外的所有位: