__int128的位操作

Kos*_*tas 6 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
Run Code Online (Sandbox Code Playgroud)

打印:

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我知道我可以使用unsigned int或long long int的简短形式,例如
(1u << 15)或(1LL << 15),但我没有找到任何128位的等价物.

我需要做什么才能使这项工作成功?

Die*_*Epp 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';
Run Code Online (Sandbox Code Playgroud)

  • @GillBates只有使用`-std = c ++ 11`启用c ++ 11(或更高版本)时,`{x}`初始化才有效. (2认同)