__int128

时间:2017-04-15 20:27:18

标签: c++ bit-manipulation

我尝试将位添加到__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位的等价物。

我需要做些什么来完成这项工作?

1 个答案:

答案 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';