我试图向__int128添加位(使用clang编译器和64位系统),但失败了。
__int128 x = 0; //DECLARING AND INITIALIZING X
x |= ((static_cast<__int128>(1)) << 95); //ADDING A '1' TO 95th BIT (from right)
std::cerr<< std::bitset<100>(x) << std::endl; //PRINTING BITSET指纹:
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
我知道有一些短表单可以用于无符号int或long long int,例如
(1u << 15)或(1LL << 15),但我没有找到任何128位等效的。
我需要做些什么才能让这件事成功?
发布于 2017-04-15 20:35:37
如果我们使用大括号std::bitset<100>{x}而不是圆括号std::bitset<100>(x),程序由于收缩转换而无法编译:
错误:不能将非常量表达式从
'__int128'类型缩小为初始化程序列表[-Wc++11-narrowing]中的[-Wc++11-narrowing]类型。
这里发生的情况是,__int128工作正常,但是向std::bitset的转换是不正确的。您必须将__int128拆分为64位块:
std::bitset<100> hi{static_cast<unsigned long long>(x >> 64)},
lo{static_cast<unsigned long long>(x)},
bits{(hi << 64) | lo};
std::cout << bits << '\n';https://stackoverflow.com/questions/43430957
复制相似问题