c++ - std::bitset constexpr >64 位值
问题描述
我想在我的程序中有一个 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
在编译时用 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。
推荐阅读
- visual-studio-code - 仅查看在 vscode 中打开的文件而不是选项卡
- android - 如何在模糊背景的同时将cardview显示为dilooge
- google-cloud-platform - MWAA 中的 apache-airflow-providers-google
- reactjs - 如何遍历 JSON 数据数组中的对象并检查其名称是否包含某个字符串?
- javascript - 仅在浏览器刷新后第一次启动时按钮动画不正确
- java - 在更改变量时在 java 中扩展的正确方法
- reactjs - 无法设置状态接口并将道具传递给反应打字稿中的其他组件
- paypal - 尝试使用信用卡付款时,PayPal 结账返回无法处理的实体 - 3D 安全
- c# - .NET Maui SQLite 连接
- linux - 为什么linux显示“文件描述符4(??????)在...上泄露”以及如何删除它?