我尝试将位添加到__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
我知道我可以使用unsigned int或long long int的简短形式,例如
(1u <&lt; 15)或(1LL <15),但我没有找到任何128位的等价物。
我需要做些什么来完成这项工作?
答案 0 :(得分:8)
如果我们使用大括号std::bitset<100>{x}
而不是括号std::bitset<100>(x)
,则由于转换范围缩小,程序无法编译:
错误:非常量表达式无法从类型
'__int128'
缩小到'unsigned long long'
初始化列表[-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';