std::bitset constexpr >64 位值

std::bitset constexpr >64bit value

我想在我的程序中有一个 bitset constexpr 变量。 bitset 可以将 unsigned long long 值作为 64 位值的构造函数,我需要 100 位值。根据 this 问答,我们可以使用将字符串作为参数的构造函数并以这种方式对其进行初始化,但它不会是 constexpr 值。 有什么办法吗?

很遗憾,constexpr std::bitset's constructors 仅限于

  • 默认一个,
  • 和那个 unsigned long long.

另外,它的修改器(set, operator[], ...)也不是constexpr,所以你不能创建constexpr “工厂”.

您必须创建自己的位集(或使用其他库中的位集)。

构造函数 std::bitset<N>(uint64_t) 是这里唯一有用的 constexpr 可调用构造函数:

constexpr bitset(unsigned long long _Val) noexcept : _Array{static_cast<_Ty>(_Need_mask ? _Val & _Mask : _Val)} {}

那只会提供 64 位的信息。

但是由于可以在编译时用另一个 std::bitset 初始化 std::bitset,理论上你可以创建一个 constexpr 函数来初始化 std::bitset 和returns 像这样:

template<size_t N>
constexpr std::bitset<N> make_bitset(const char* x) {
    std::bitset<N> result;

    for (int i = 0; x && x[i] != '[=11=]'; ++i) {
        result.set(i, x[i] - '0');
    }

    return result;
}

遗憾的是,这无法编译,因为 std::bitset<N>::set 未声明 [​​=14=]。但是看看 set 函数,理论上这个函数可以声明为 constexpr:

bitset& _Set_unchecked(size_t _Pos, bool _Val) noexcept { // set bit at _Pos to _Val, no checking
    auto& _Selected_word = _Array[_Pos / _Bitsperword];
    const auto _Bit      = _Ty{1} << _Pos % _Bitsperword;
    if (_Val) {
        _Selected_word |= _Bit;
    } else {
        _Selected_word &= ~_Bit;
    }

    return *this;
}

但在那之前,你无法在编译时用超过 64 位的信息初始化一个 std::bitset