【发布时间】:2016-07-10 13:08:54
【问题描述】:
假设您在 C 中有一个 uint8_t 数组,数组的大小为 10。我想在数组中生成所有可能的二进制组合,这 80 位。
这可以通过 10 个嵌套循环来实现,每个循环对应数组的每个元素。但是,如果您不知道大小,则无法动态更改嵌套循环的数量。
是否有任何递归方法可以让您将这 80 位视为单个数字并从 000000000 ...... 直到 1111111111 ...... 其中 0 和 1 的数量等于 80?
我考虑过 GNU gmp,但最大的数字是 1024 位,您不能将它们作为代表实际数字的简单位来访问。
我只想做一个大计数器,从 0 到 2^80 计数,但在数组内部。
我想举个例子。包含两个字节的 uint8_t 数组:
|00000000|00000000|
|00000000|00000001|
|00000000|00000010| . . .
|00000000|11111111|
|00000001|00000000|
|00000001|00000001|
|00000001|00000010|
。 .
#include <gmp.h>
#include <stdio.h>
#include <assert.h>
int main()
{
mpz_t n;
int flag;
//Initialize the number.
mpz_init(n);
mpz_set_ui(n,0);
//Add one to the number */
mpz_add_ui(n,n,1); /* n = n + 1 */
}
您将如何访问数字 n 并将内容复制到您的数组中?
memcpy(array, &n, 10) ?
【问题讨论】:
-
我知道它可能永远不会结束。但如果数组的字节数较少,则它可以完成。
-
@2501 或者您需要简单地正确使用 GMP,其全部目的是允许有效处理此类操作。
-
@MarcusMüller OP 正在练习。使用 GMP 违背了这个意图。
-
@2501:我同意。这是学习如何使用进位的一个很好的课程。我确实认为 10 个字节有点太长了,因为它需要很长时间。我会先尝试 4 个字节。原理是一样的。
-
@J.East。你仍然需要展示你的尝试并提出一个特定的问题。我希望您不要期望有人会为您编写代码。