【问题标题】:How to concatenate two 64bits integer into a 128 bits integer? [duplicate]如何将两个 64 位整数连接成一个 128 位整数? [复制]
【发布时间】:2013-12-12 05:31:50
【问题描述】:

我有 2 个 64 位整数,我想将它连接成一个 128 位整数。

    uint64_t len_A;
    uint64_t len_C;

    len_AC= (len_A << 64) | len_C;

GCC 不支持uint128_t

还有其他方法吗?

【问题讨论】:

标签: c concatenation 128-bit


【解决方案1】:

首先,您应该决定如何存储 128 位整数。 该维度没有内置的整数类型。

您可以将整数存储为一个由两个 64 位整数组成的结构体:

typedef struct { uint64_t high; uint64_t low; } int128;

那么答案就很简单了。

问题是你接下来要如何处理这个整数。

【讨论】:

  • 我需要对得到的 128 位整数进行异或运算,我还能使用这种方法吗?
  • 是的,当然。 XOR 是按位运算。只需对相应部分执行 XOR,例如 c.high = a.high ^ b.high; c.low = a.low ^ b.low;
【解决方案2】:

正如灵感所说:

问题是接下来你要如何处理这个整数。

您可能希望使用任意精度库,以一种可移植且可靠的方式为您处理此问题。为什么?因为您可能会发现自己在处理字节顺序问题,例如在给定硬件中选择整数的高端或低端。

即使您确定您的代码将在哪里运行,您仍然需要开发一整套处理 128 位整数的函数,因为并非所有编译器都支持 128 位类型,(似乎 GCC确实支持这种类型的整数),例如,您需要为基本的数学运算创建一组函数。

如果您使用 GMP 库可能会更好,请访问以下链接了解更多信息: http://gmplib.org/

【讨论】:

    【解决方案3】:

    如果您的 GCC 没有 uint128_t,它肯定没有 128 位整数。

    所以你需要代表他们,例如像

    这样的结构
     struct my128int_st {
           uint64_t hi, lo;
     } ac;
     ac.hi = a;
     ac.lo = c;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-15
      • 2015-10-17
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 2012-03-16
      相关资源
      最近更新 更多