在 C++17 中,是否有办法在编译时生成前 N 位设置的常量?
在伪代码中,我正在寻找类似的东西:
constexpr uint32_t MY_CONSTANT = setBits<2>();
Run Code Online (Sandbox Code Playgroud)
相当于:
constexpr uint32_t MY_CONSTANT = 0b11;
Run Code Online (Sandbox Code Playgroud)
换句话说,给定编译时常量 N,返回编译时常量 M,其中位 0 到 (N-1) 为 1(设置)。
我认为标准库中没有现成的函数(尽管从 C++23std::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>();
Run Code Online (Sandbox Code Playgroud)
示例setBits<std::uint8_t, 2>()
:
0b00000001
<< 2
-------------
= 0b00000100
0b00000100
- 1
-------------
= 0b00000011
Run Code Online (Sandbox Code Playgroud)
或者否定0
设置所有位并右移除位之外的所有N
位:
0b00000001
<< 2
-------------
= 0b00000100
0b00000100
- 1
-------------
= 0b00000011
Run Code Online (Sandbox Code Playgroud)