问题
我需要创建 32 位数字(有符号或无符号都无关紧要,无论如何都不会设置最高位)并且每个数字都必须设置给定数量的位。
天真的解决方案
最简单的解决方案当然是从零开始。在一个循环内,数字现在增加一,对位的数量进行计数,如果计数具有所需的值,则将数字存储到列表中,如果不是,则循环重复。如果找到足够的数字,则停止循环。当然,这工作得很好,但是一旦所需的位数变得非常高,它就会非常慢。
更好的解决方案
设置(假设)5 位的最简单数字是设置前 5 位的数字。这个号码可以很容易地创建。在一个循环中,第一位被设置并且数字向左移动一个。这个循环运行了 5 次,我找到了第一个设置了 5 位的数字。接下来的几个数字也很容易创建。我们现在假设这个数字是 6 位宽,并且最高的没有设置。现在我们开始将第一个零位向右移动,因此我们得到 101111、110111、111011、111101、111110。我们可以通过在前面添加另一个 0 并重复此过程来重复此过程。0111110、1011110、1101110 等。然而,这样数字的增长速度会比必要的快得多,因为使用这种简单的方法,我们会忽略像 1010111 这样的数字。
那么有没有更好的方法来创建所有可能的排列,一种通用的方法,可以使用,不管下一个数字有多少位,也不管我们需要设置多少位?