我需要遍历所有最多有 k 位 ON(位 1)的 n 位整数,其中 0 < n <= 32 和 0 <= k <= n。例如,如果 n = 4 且 k = 2,则这些数字为(二进制):0000、0001、0010、0100、1000、0011、0101、0110、1001、1010、1100。这些数字的顺序是循环并不重要,但每个只访问一次。
目前我正在使用这个简单的算法:
for x = 0 to (2^n - 1)
count number of bits 1 in x
if count <= k
do something with x
end if
end for
我认为这种算法效率低下,因为它必须遍历太多数字。例如,如果 n = 32 且 k = 2,则它必须遍历 2^32 个数字才能仅找到 529 个数字(具有 <= 2 位 1)。
我的问题是:有没有更有效的算法来做到这一点?