【发布时间】:2023-03-14 19:15:02
【问题描述】:
我正在寻找一个运算符来生成低于 2^n 的所有数字,其二进制表示形式为 1 的数量。
例如:
int next(int cur, int max) { /* ??? */ }
for (int i=0; i< 1<<6; i = next(i, 1<<6)) printf("%d ", i);
应该给出类似的东西:
0 1 2 4 8 16 32 3 5 6 9 10 12 17 18 20 24 33 34 36 40 48 7 11 13 14 19 21 22 25 26 28 35 37 38 41 42 44 49 50 52 56 15 23 27 29 30 39 43 45 46 51 53 54 57 58 60 31 47 55 59 61 62 63
(与1相同的数字顺序无关)
是否可以编写一个纯next() 函数而不记住任何状态?
这可能看起来像 Encoding system sorted by the number of 1 的重复,但这个问题是询问如何生成下一个数字而不是按索引返回
【问题讨论】:
-
(1) 编写一个函数,给定
int,返回 1 的位数。 (2) 用整数 1 到 N 填充数组。 (3) 调用qsort,将指针传递给 (4) 比较函数,该函数使用 (1) 中的位计数函数。最后,(5)打印出排序后的数组。如果您需要帮助计算位数或致电qsort,您可以提出,但它们都是非常常见的问题,所以请先搜索。 -
next需要是纯函数吗?记住调用之间的更多状态或递归枚举数字可能更容易。 -
生成包含相同个
1s的有序序列是没有问题的。问题是过渡到下一个序列。我想一旦你做了第一个,你就可以知道哪个数字是该序列中的最后一个,并编写逻辑来检测它。 -
假装数字是0和1的数组。找到最右边的 01 组合。交换这两个元素,并将其右侧的所有 1 移到最右端。如果不存在 01 组合,但仍有 0,则将其替换为 1,并将所有 1 移到最右边。
-
请注意,当您从 6 中设置 2 位的权限时,您还可以从 6 中设置 4 位的权限(通过反转),类似地,6 中的 1 和 6 中的 5 等。
标签: algorithm bit-manipulation