首页 > 解决方案 > std::bitset constexpr >64 位值

问题描述

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

标签: c++bitset

解决方案


构造函数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在编译时用 another初始化 a std::bitset,理论上你可以创建一个constexpr初始化 astd::bitset并返回它的函数,如下所示:

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

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

    return result;
}

可悲的是,这不会因为std::bitset<N>::set未声明而编译constexpr。但是看看这个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;
}

但在那之前,您不能std::bitset在编译时使用超过 64 位的信息来初始化 a。


推荐阅读