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

idfiyjo8  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(139)

在C++17中,有没有办法在编译时生成一个前N位的常量?
在伪代码中,我将查找类似于以下内容的内容:

constexpr uint32_t MY_CONSTANT = setBits<2>();

相当于:

constexpr uint32_t MY_CONSTANT = 0b11;

换句话说,给定编译时常数N,返回编译时常数M,其中位0至(N-1)为1(设置)。

abithluo

abithluo1#

我不认为在标准库中有现成的函数(尽管std::bitset::set从C++23开始就是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>()的示例:

0b00000001
<<          2
-------------
=  0b00000100

   0b00000100
-           1
-------------
=  0b00000011

或者对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);
}

相关问题