繁体   English   中英

std::bitset constexpr >64 位值

[英]std::bitset constexpr >64bit value

我想在我的程序中有一个 bitset constexpr 变量。 bitset 可以将 unsigned long long 值作为 64 位值的构造函数,我需要 100 位值。 根据这个问答,我们可以使用将字符串作为参数的构造函数并以这种方式对其进行初始化,但它不会是 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 function 来初始化一个std::bitset std::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 function,理论上这个 function 可以声明为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

不幸的是, constexpr std::bitset的构造函数仅限于

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

此外,它的修改器( setoperator[] ,...)也不是constexpr ,所以你不能创建一个constexpr "factory"

您必须创建自己的位集(或使用另一个库中的位集)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM