我的应用程序中存在一种情况,其中应用程序使用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)
{
// ...
}
答案 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;
}