【问题标题】:Represent 128 bit integer as two 64 bit integers in C++在 C++ 中将 128 位整数表示为两个 64 位整数
【发布时间】:2019-03-15 22:11:23
【问题描述】:

在我的应用程序中遇到一种情况,应用程序使用 128 位整数(特别是 __uint128_t),有时应用程序需要将此 128 位整数编码为两个 64 位整数(__uint64_t )。

(为了这个问题,假设它必须像这样对它们进行编码——这个问题不是关于编码它的替代方法)

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

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

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

使用示例:

__uint128_t bigIntBefore = 999999999999999999;
__uint64_t smallInt1;
__uint64_t smallInt2;
encode(bigIntBefore, smallInt1, smallInt2);

// ... later

__uint128_t bigIntAfter;
decode(smallInt1, smallInt2, bigIntAfter);
// bigIntAfter should have a value of '999999999999999999'

【问题讨论】:

  • 一个 int128 可能已经是一个包含 2 个 int 64 的结构。
  • 你的 128 位整数类型来自哪里?编译器扩展、库,什么?
  • @Shawn 不太确定,我认为__uint128_t__uint64_t 有点标准。我会试着找出答案。 (我是 C++ 菜鸟,请原谅我)
  • @JamesWierzba:他们很不标准......标准是this
  • 问问自己这个问题:您如何将 64 位 unsigned int 编码/解码到两个 32 位 unsigned ints?一个 32 位 unsigned int 从/到两个 16 位 unsigned ints 怎么样?如何从 8 位 unsigned ints 序列中编码/解码这些类型中的任何一种?

标签: c++ encoding int


【解决方案1】:

嗯,为什么不这样做:

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;
}

【讨论】:

  • 或者:dest1 = src; dest2 = src / (__uint128_t{UINT64_MAX} + 1);return src1 + src2 * (__uint128_t{UINT64_MAX} + 1);
  • 嘿 einpoklum,为什么我们需要掩码来进行编码步骤?我们不能只做dest1 = srcdest2 = src &gt;&gt; 64; 而不是dest1 = src &amp; bottom_mask;dest2 = (src &amp; top_mask) &gt;&gt; 64;
  • @JamesWierzba:是的,我们可以,我只是在强调什么位在哪里。
  • 我明白了。另外,这样安全吗?将较大整数分配给较小整数的行为取决于编译器,不是吗?我们在这里假设赋值采用低阶 64 位,这总是是这种情况吗?
  • @JamesWierzba:据我所知,将较大的无符号整数分配给较小的无符号整数 的行为是明确定义的;请参阅网站上的this answer
猜你喜欢
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 2015-10-17
  • 2012-02-11
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
相关资源
最近更新 更多