算法 – 在最多k位ON的情况下循环整数的最佳方法是什么?

我需要遍历所有n位整数,其最多k位ON(位1),其中0 <1. n <= 32且0 <= k <= n.例如,如果n = 4且k = 2,那么这些数字是(二进制数字):0000,0001,0010,0100,1000,0011,0101,10110,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). 我的问题是:有没有更有效的算法来做到这一点?

最佳答案
您将需要使用自己的按位计数算法来递增循环计数器.基本上,为了计算序列中的下一个数,如果少于k’1’位,则正常递增,如果有k’1’位,则在最低有效’1’之后假装’0’位存在并正常增加.

另一种说法是,使用标准计数器,您将最低有效位加1并进位.在你的情况下,当存在k个’1’时,你将在1中添加到最低的’1’位.

例如,如果k为2且你有1010忽略最后的0并增加101,那么你得到110然后加上0为1100.

这是用于递增数字的伪代码:

Count 1 bits in current number
If number of 1's is < k
  number = number + 1
Else
  shift_number = number of 0 bits after least significant 1 bit
  number = number >> shift_number
  number = number + 1
  number = number << shift_number

转载注明原文:算法 – 在最多k位ON的情况下循环整数的最佳方法是什么? - 代码日志