Algorithm 在设置第i位的情况下,对1和N(含)之间的数字进行计数

Algorithm 在设置第i位的情况下,对1和N(含)之间的数字进行计数,algorithm,bit-manipulation,bitmask,Algorithm,Bit Manipulation,Bitmask,我想计算1和N之间有多少个整数设置了第I位。例如,如果N=10和i=0,则结果应为5,因为1=00012、3=00112、5=01012、7=01112和9=10012在位0处都有1 简单的线性时间解决方案是从1迭代到N,然后针对每个数字,查看是否设置了第i位 一个稍微好一点的方法是,因为对于已知的2次方,比如2x,2x−1数字将设置第i位,直到数字2x−1,其中0≤首先让我们看一个例子。如果我们设置n=10,我们看第二位,从右边看k=1,我们看到: 0000 0 0001 0 00

我想计算1和N之间有多少个整数设置了第I位。例如,如果N=10和i=0,则结果应为5,因为1=00012、3=00112、5=01012、7=01112和9=10012在位0处都有1

简单的线性时间解决方案是从1迭代到N,然后针对每个数字,查看是否设置了第i位


一个稍微好一点的方法是,因为对于已知的2次方,比如2x,2x−1数字将设置第i位,直到数字2x−1,其中0≤首先让我们看一个例子。如果我们设置n=10,我们看第二位,从右边看k=1,我们看到:

0000    0
0001    0
0010    1
0011    2
0100    2
0101    2
0110    3
0111    4
----
1000    4
1001    4
1010    5
例如,对于k=1,我们获得以下计数:

Prelude Data.Bits> map (countBit 0) [0..32]
[0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16]
Prelude Data.Bits> map (countBit 1) [0..32]
[0,0,1,2,2,2,3,4,4,4,5,6,6,6,7,8,8,8,9,10,10,10,11,12,12,12,13,14,14,14,15,16,16]
Prelude Data.Bits> map (countBit 2) [0..32]
[0,0,0,0,1,2,3,4,4,4,4,4,5,6,7,8,8,8,8,8,9,10,11,12,12,12,12,12,13,14,15,16,16]
Prelude Data.Bits> map (countBit 3) [0..32]
[0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,8,8,8,8,8,8,8,8,9,10,11,12,13,14,15,16,16]
Prelude Data.Bits> map (countBit 4) [0..32]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,16]
对于n=10和k=1,我们得到了预期的:

Prelude Data.Bits> countBit 0 10
5
Prelude Data.Bits> countBit 1 10
5
或者,对于从0到12345(含)的数字,我们可以使用列k=3计算设置位数,包括:

Prelude Data.Bits> countBit 3 12345
6170
或对于k=15和n=12'345'678'901'234'567'890

对于n=123'456'789'012'345'678'901'234'567'890:


我们在这里执行一些位移位和减法运算,对于较大的数字,这些运算可以在Olog N时间内完成,其中N为上限值。

有,尽管需要log2n,因为随着N变大,需要考虑N的位数。@WillemVanOnsem请分享算法,因为logn始终是线性时间解决方案的改进。前2^k-1项的选择位数为0,而剩余的最多2^k-1项的选择位数为1。你这是什么意思?@PiyushRanjan:看看水平条下的项目,k=2时,该位的前2^k-1=2元素为0,其余2位为1,当然我们对所有这些位本身不感兴趣。
Prelude Data.Bits> countBit 3 12345
6170
Prelude Data.Bits> countBit 15 12345678901234567890
6172839450617282560
Prelude Data.Bits> countBit 15 123456789012345678901234567890
61728394506172839450617282560