【发布时间】:2010-10-05 03:25:24
【问题描述】:
问题
我需要创建 32 位数字(有符号或无符号都无所谓,无论如何都不会设置最高位)并且每个数字都必须设置给定数量的位。
天真的解决方案
最简单的解决方案当然是从零开始。在一个循环内,数字现在增加一,对位的数量进行计数,如果计数具有所需的值,则将数字存储到一个列表中,如果不是,则循环重复。如果找到足够的数字,则停止循环。当然,这工作得很好,但是一旦所需的位数变得非常高,它就会非常缓慢。
更好的解决方案
设置(假设)5 位的最简单数字是设置前 5 位的数字。这个号码可以很容易地创建。在一个循环中,第一位被设置并且数字向左移动一个。这个循环运行了 5 次,我找到了第一个设置了 5 位的数字。接下来的几个数字也很容易创建。我们现在假设这个数字是 6 位宽,并且最高的没有设置。现在我们开始将第一个零位向右移动,因此我们得到 101111、110111、111011、111101、111110。我们可以通过在前面添加另一个 0 并重复此过程来重复此过程。 0111110、1011110、1101110 等。然而,这样数字的增长速度会比必要的快得多,因为使用这种简单的方法,我们会忽略 1010111 这样的数字。
那么有没有更好的方法来创建所有可能的排列,一种通用的方法,可以使用,无论下一个数字有多少位,也不管我们需要设置多少位?
【问题讨论】:
-
使用combinadic form (combinatorial number system) 中的整数表示和实际(按字典顺序排列的组合)之间的自然(也称为Lehmer)映射进行生成。处理数字的二进制表示是生成组合、排列和幂集的关键
标签: algorithm binary permutation combinations