1的数目_扩展问题
扩展问题:给定二进制数N,写下从1开始到N的所有二进制数,数一下其中出现的所有“1”的个数:
f(1)=1
f(10)=10 (因为01,10,有两个1)
f(11)=100 (因01,10,11,有四个1)
解答:考虑f(1011):1,10,11,100,101,110,111,1000,1001,1010,1011
第一位上:高位数为101,每两个数就出现一个1,则出现101个1;且current位为1,低位数为0,所以5+1=6
第二位上:高位数为10,每四个数出现一个1,则出现(10)*2=4个1;且current位为1,低位数为1,所以4+1+1=6
第三位:高位数为1,出现(1)*2^2=4个1;且current位为0,低位数为11;所以4+0=4
第四位:高位数为0,,current位为1,低位数为011;所以为 低位数+1=4
通过观察发现在 current==1 时,第n位上出现1的次数 = 高位数*2^n-1 +低位数+1
current==0 时,第n位上出现1的次数 = 高位数*2^n-1
附:
十进制 | 二进制 | 最右边1的个数总和 | 倒数第二1的个数总和 | 倒数第三1的个数总和 | 倒数第四1的个数总和 | 倒数第五1的个数总和 | 十进制 | 二进制 | 最右边1的个数总和 | 倒数第二1的个数总和 | 倒数第三1的个数总和 | 倒数第四1的个数总和 | 倒数第五1的个数总和 |
0 | 00000 | 0 | 0 | 0 | 0 | 0 | 13 | 01101 | 7 | 6 | 6 | 6 | 0 |
1 | 00001 | 1 | 0 | 0 | 0 | 0 | 14 | 01110 | 7 | 7 | 7 | 7 | 0 |
2 | 00010 | 1 | 1 | 0 | 0 | 0 | 15 | 01111 | 8 | 8 | 8 | 8 | 0 |
3 | 00011 | 2 | 2 | 0 | 0 | 0 | 16 | 10000 | 8 | 8 | 8 | 8 | 1 |
4 | 00100 | 2 | 2 | 1 | 0 | 0 | 17 | 10001 | 9 | 8 | 8 | 8 | 2 |
5 | 00101 | 3 | 2 | 2 | 0 | 0 | 18 | 10010 | 9 | 9 | 8 | 8 | 3 |
6 | 00110 | 3 | 3 | 3 | 0 | 0 | 19 | 10011 | 10 | 10 | 8 | 8 | 4 |
7 | 00111 | 4 | 4 | 4 | 0 | 0 | 20 | 10100 | 10 | 10 | 9 | 8 | 5 |
8 | 01000 | 4 | 4 | 4 | 1 | 0 | 21 | 10101 | 11 | 10 | 10 | 8 | 6 |
9 | 01001 | 5 | 4 | 4 | 2 | 0 | 22 | 10110 | 11 | 11 | 11 | 8 | 7 |
10 | 01010 | 5 | 5 | 4 | 3 | 0 | 23 | 10111 | 12 | 12 | 12 | 8 | 8 |
11 | 01011 | 6 | 6 | 4 | 4 | 0 | 24 | 11000 | 12 | 12 | 12 | 9 | 9 |
12 | 01100 | 6 | 6 | 5 | 5 | 0 | 25 | 11001 | 13 | 12 | 12 | 10 | 10 |