【问题标题】:Concentrate 30 integers into a single 64bit integer in C [closed]在 C 中将 30 个整数集中为一个 64 位整数 [关闭]
【发布时间】:2014-08-03 22:31:11
【问题描述】:

我有一个 20x30 的数组,其中包含 int 类型的值。每一行应该集中成一个数字。例如,考虑一个 3x4 数组: |1 3 6 1| |4 2 5 2| |8 3 1 5| 它应该变成:|1361、4252、8315| 问题是,我有 30 个数字,所以我需要 30 个数字,而我可以使用 unsigned long long int 存储的最大数字是 +18,446,744,073,709,551,615,它只包含 20 个数字

原始问题: 上一个问题是分配的一部分,其中我有一个返回 Nx30 数组的哈希函数。数组的每一行由 30 个整数组成,并将它们放在一起,表示 N 个输入数据之一的 30 位哈希值。

我必须使用基数排序对这些哈希进行排序。我的导师告诉我,我可以将这 30 位数字匹配为 64 位整数。鉴于哈希值在 0-3 的范围内,我可以将它们集中在一个 64 位数组中,每个位使用 2 位吗?

【问题讨论】:

  • 那么,你想在一个整数中存储30个整数吗?即使前 30 个是 32 位而不是 64 位,它仍然是不可能的。提供问题的更多细节和您想要实现的代码示例可能有助于我们指导您找到更好的解决方案。
  • 你所有的整数都是个位数吗?
  • 如果stdint 中存在uint32_tuint64_t,则必须使用它们的数组。
  • 存储 0..9 范围内的 30 个数字需要 100 位。微不足道的数学:10^30 = 2^99.6578。唯一的出路是限制数字可以是什么。如果你只有 4 个值,比如 0..3,那么 4^30 = 2^60。这是你能做到的最好的。
  • 话说,问题没有解决办法。如果我们知道您为什么要这样做,也许会有办法。

标签: c int long-integer largenumber


【解决方案1】:

你需要超过 64 位来存储 30 个个位数的整数。

C 语言没有内置的大于 64 位的数字类型。不过,一些编译器支持它们。恕我直言,您最好使用 GMP 或其他支持它的库,而不是依赖特定的编译器。作为最后一个资源,您可能希望自己实现它,这不是一项非常简单的任务。

【讨论】:

  • uint128_t 是编译器扩展而不是标准的一部分(例如在 stdint 中)?
  • @FiddlingBits:C99 和 C11 不提供超过 64 位的数字类型。例如,如果您使用 GCC,则可以使用 __uint128_t 或使用 __attribute__((mode(TI))) 定义自己的 128 位整数类型。
  • @jweyrich:这两个标准都提到了扩展整数类型,但这只是一种可能性而不是要求。有趣的是 GCC 文档 claims(虽然不是直接的),__uint128_t 不是 EIT。
猜你喜欢
  • 2019-03-15
  • 2017-12-01
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 2019-08-17
  • 1970-01-01
相关资源
最近更新 更多