在C ++中将128位整数表示为两个64位整数

时间:2018-10-10 22:36:04

标签: c++ encoding int

我的应用程序中存在一种情况,其中应用程序使用128位整数(特别是__uint128_t),并且在某些时候,应用程序需要将此128位整数编码为两个64位整数({ {1}}。

(仅出于这个问题的考虑,它必须像这样对它们进行编码-这个问题与编码的替代方法无关)

我该怎么做?我必须能够编码和解码。

__uint64_t

用法示例:

void encode(__uint128_t src, __uint64_t &dest1, __uint64_t &dest2)
{
    // ...
}

void decode(__uint64_t src1, __uint64_t src2, __uint128_t &dest)
{
    // ...
}

1 个答案:

答案 0 :(得分:3)

嗯,为什么不做呢?

void encode(__uint128_t src, __uint64_t &dest1, __uint64_t &dest2)
{
    constexpr const __uint128_t bottom_mask = (__uint128_t{1} << 64) - 1;
    constexpr const __uint128_t top_mask = ~bottom_mask;
    dest1 = src & bottom_mask;
    dest2 = (src & top_mask) >> 64;
}

void decode(__uint64_t src1, __uint64_t src2, __uint128_t &dest)
{
    dest = (__uint128_t{src2} << 64) | src1;
}

当然,这可能是徒劳的,因为__uint128_t可能已经是2个64位值。另外,更喜欢返回一个值而不是使用左值引用:

std::pair<__uint64_t,__uint64_t> encode(__uint128_t src)
{
    constexpr const __uint128_t bottom_mask = (__uint128_t{1} << 64) - 1;
    constexpr const __uint128_t top_mask = ~bottom_mask;
    return { src & bottom_mask, (src & top_mask) >> 64 };
}

__uint128_t decode(__uint64_t src1, __uint64_t src2)
{
    return (__uint128_t{src2} << 64) | src1;
}