首页 > 试题广场 >

每一位上1的个数共有()

[单选题]
用二进制表示十进制1-4,分别为1,10,11,100,这些二进制数每一位上1的个数共为5个.那么,用二进制表示的十进制数1-128,每一位上1的个数共有()
  • 1025
  • 448
  • 449
  • 1024
答案是:128 * 7 / 2 + 1 = 449
因为127=1111111,七个1。即每一位上可以是0或者1。总共128个数,每一位上有一半是0,一半是1。所以除以2。
128即是第8位为1。所以需要加1。
发表于 2015-12-04 12:49:12 回复(9)
128 = 2^7 = [1000 0000]
0 [000 0000 ] 127 [111 1111]  这 128个数中,0和1出现了各一半
故从0到127中出现1的次数是  7 * 128 / 2 = 448
再加上128 的二进制表示中的那个1,合计是 449 次
发表于 2016-01-29 14:43:06 回复(0)
利用排列组合的方法来这个地方我打不出那种特殊符号,就这么表示:C(m,n)表示从n个元素中选择m个元素,除了最后一个数128是8位的,其他都是7位的(左边补齐0),所以有这样的式子(n为1的个数):
n=1+1*C(1,7)+2*C(2,7)+3*C(3,7)+4*C(4,7)+5*C(5,7)+6*C(6,7)+7*C(7,7)
  =1+1*C(1,7)+2*C(2,7)+3*C(3,7)+4*C(3,7)+5*C(2,7)+6*C(1,7)+7*C(7,7)
  =1+7*( C(1,7)+2*C(2,7)+3*C(3,7) )+ 7*C(7,7)
  =449
第一个的1表示前面提到的128八位数的情况
发表于 2015-11-23 21:00:01 回复(4)
0和127的位置上相加为7个1;1和126的位置上相加为7个1;2和125的位置上相加为7个1,依次类推得到是128个数共有一半的数加一起是全1,所以就是128 / 2 * 7,1-128比0-127多一个1,所以是128 / 2 * 7 + 1 = 449
发表于 2016-03-07 18:28:24 回复(3)
449   选C
发表于 2016-01-19 16:31:44 回复(0)
1-4:共有22个数,将它们都看作两位数,则有一半0,一半1,还有一个100的1.
        因此共有  22*2/2+1=5  个1
1-8:共有23个数,将它们都看作三位数,则有一半0,一半1,还有一个1000的1.
        因此共有  23*3/2+1=13  个1
1-128:共有27个数,将它们都看作两位数,则有一半0,一半1,还有一个10000000的1.
        因此共有  27*7/2+1=449  个1
编辑于 2016-09-01 08:50:49 回复(0)
公式  (n-1)*(2^(n-2))+1, n为二进制数的位数。n=8,带入即可。 即:7*(2^6)+1=449 
编辑于 2016-08-02 00:11:51 回复(0)
2^1+ 2^2+ 2^3+ 2^4+ 2^5+ 2^6+ 2^7
发表于 2015-11-25 15:02:42 回复(0)
总结成一个公式:0~2^n:共有n*2^(n-1)+1个1
发表于 2018-08-15 15:27:51 回复(0)
可用数列来做。n表示位数,n=1时,S(1)=1,n=2时,有S(2)=1*2+2=4,S(3)=12=2*S(2)+2^2。
有S(n+1)=2*S(n)+2^n,S(1)=1。
n=2时,10,11的个位1之和即S(1),十位1的个数为11(2)-1(2)=2=2^1。
n=3时,对三位数,有100,101,110,111,后两位之和为S(2),百位1的个数为111(2)-11(2)=100(2)=2^2。所以S(3)=2*S(2)+2^2.
1~127为1到7位的2进制数,128为1000 0000(2),
易得S(n+1)=(n+1)*2^n.
所以1~128的1个数和为S(7)+1=7*2^6+1=7*64+1=449.

编辑于 2018-03-10 16:40:29 回复(0)
发表于 2017-04-24 21:43:07 回复(0)
首先 128的二进制值为:1000 0000
127 的二进制值为:111 1111
先算1-127  ,可以类比为0-127,因为0的二进制数中并没有1,所以为了计算方便从0算起
一共7*128个二进制数,每个二进制数可能为0,也可能为1,所以1的个数一共为7*128/2=7*64=488,最后加上128的一个=489
发表于 2017-01-07 14:26:33 回复(0)
D_L头像 D_L
// 449
#include <iostream> #include <stdint.h> #include <cmath> using namespace std; uint64_t f(uint64_t n) { if (n == 2) return 5; // 2^2 = 4, 1~4 时结果为 5 return 2 * f(n -1) -1 + std::pow(2, n - 1); } int main() { cout << f(7) << endl; // 2^7 = 128 return 0; }

编辑于 2016-09-01 17:54:15 回复(0)
求法:转换成000 0000-111 1111(0-127),128个数每两个0-127,1-126。。。每两个配对组成127(111 1111)所以就是128*7/2个1,再加上128就是449个
发表于 2016-08-08 14:04:05 回复(0)
128 = 2^7 = [1000 0000]
  0 [000 0000   ]     127 [111 1111]    这 128个数中,0和1出现了各一半
故从0到127中出现1的次数是  7 * 128 / 2 = 448
再加上128 的二进制表示中的那个1,合计是 449 次
发表于 2016-06-03 20:36:12 回复(0)
对于0-3这四个数,1的个数为4
0-7: 其中的4-7相当于在0-3这些数前面添1,所以1的总个数为4+(4+2)=4*2+4=12
0-15:其中的7-15相当于在0-7前面添1,1的总个数为12+(12+8)=12*2+8=32
0-31: 32*2+16=80
0-63:80*2+32=192
0-127:192*2+64=448

最后加上128里面点一个1,所以结果为449

发表于 2015-12-29 11:25:47 回复(0)
答案是449。分析:在分析结论的时候,可以用16以内的数字来分析总体结论,把16以内的数字分别用2的整数次幂的数字的加和表示出来,比如: 1=1; 2=2; 3=2+1; 4=4; 5=4+1; 6=4+2; 7=4+2+1; 8=8 9=8+1; 10=8+2; 11=8+2+1; 12=8+4; 13=8+4+1; 14=8+4+2; 15=8+4+2+1; 16=16; 这样表示出来以后就可以看到,二进制位的个位是1的个数与以上等式中1的个数相等,因为1=2^0。百位是1的个数与以上等式中2的个数相等,因为2=2^1……这样以此类推,将每一位上二进制位的个数表示出来,然后相加,就可以得到所有的二进制位的个数。通过以上分析和计算,这样得出以下结论: 1-4: 2^1+2^1+1= 2^1*2+1=5; 1-8: 2^2+2^2+2^2+1=2^2*3+1=13; 1-16:2^3+2^3+2^3+2^3+1=2^3*4+1=33; .......; 1-2^n: 2^(n-1)*n+1; 故: 1-128: 2^6*7+1=449;
编辑于 2015-11-24 12:17:49 回复(0)
应该用7套公式,答案449
发表于 2015-11-23 18:57:49 回复(0)