以从 a 到 b 的数字的二进制表示形式计算 "1" 位数字的算法

Algorithm to count "1" digits in binary representation of a numbers from a to b

本文关键字:数字 计算 算法 表示 二进制 以从      更新时间:2023-10-16

如何在从a到b的数字的二进制表示中计数"1"位。

其中0<a<=b<10^16.

要找到任务p[a.b]的解决方案,您必须找到子问题p[0].b]和p[0].a]的解,并减去这些值
现在考虑P[0..x]任务。简单情况x=2^k(100.000bin).

0th bit is set in 2^k/2 numbers (it alternates every time)
1th bit is set in 2^k/2 numbers (it alternates after pair of numbers)
..
k-1th bit is set in 2^k/2 numbers (in 2^(k-1)..(2^k)-1))
kth bit is set in one number (in 2^k)

所以

P[0..2^k] = k * 2^(k-1) + 1

要找到任意x的解决方案,我们可以利用x的二进制表示,例如:
P(1010b) = P(1000b) + P(10b)

伪码

P = 0
k = 0 
while x <> 0 do
   if (x and 1) then //check if kth bit is set in x
       P = P + k * 2^(k-1) + 1 
   x = x >> 1  //shift right
   k = k + 1