【问题标题】:Are bitwise operator working on __int128 in c++按位运算符是否在 C++ 中处理 __int128
【发布时间】:2023-01-10 02:24:53
【问题描述】:

我正在做一个项目,我必须将 __int128 转换为 uint8_t 的向量。
我已经有一个将 long 转换为 uint8_t 向量的函数。
我想做类似的事情:

__int128 data = 0x5bc5ddd975d34ed0b4f18b410e7d2480
addLong(data >> 64);
addLong(data & 0xFFFFFFFFFFFFFFFF);

结果我得到了这个:00000000b4f18b41e7d2480
如您所见,第二部分,即 64 个低位字节被正确处理,但大多数字节未被正确处理。 你知道这是否可能吗?

做这样的事情:

std::cout << std::hex << (long)(data >> 48) << std::endl;

给我结果:b4f1。
这就是我认为按位运算符不适用于 __int128 的原因。

【问题讨论】:

    标签: c++ bit-manipulation


    【解决方案1】:

    按位运算符有效,但您的初始化无效。整数文字不能大于 long long。

    我建议为初始化添加一个辅助函数(如果 gcc 中还没有):

    #include <cstdint>
    #include <iostream>
    
    __int128 init_int128(std::int64_t high, std::uint64_t low) {
        return __int128(high) << 64 | low;
    }
    
    int main() {
        __int128 data = init_int128(0x5bc5ddd975d34ed0, 0xb4f18b410e7d2480);
    
        std::cout << std::hex;
        std::cout << static_cast<std::int64_t>(data >> 64) << '
    ';
        std::cout << static_cast<std::uint64_t>(data) << '
    ';
    }
    

    输出

    5bc5ddd975d34ed0
    b4f18b410e7d2480
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 2012-09-27
      相关资源
      最近更新 更多