创建前 N 位设置的编译时常量

Pat*_*ght 3 c++ c++17

在 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(设置)。

Ted*_*gmo 5

我认为标准库中没有现成的函数(尽管从 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)