[英]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
。 此外,它的修改器( set
, operator[]
,...)也不是constexpr
,所以你不能创建一个constexpr
"factory" 。
您必须创建自己的位集(或使用另一个库中的位集)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.