二进制数中‘1’的个数

  • Arvin Qin
  • 5 Minutes
  • June 6, 2018

####11.二进制中1的个67767

Pro:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

感觉还是比较有意思,如果是正整数自然好求,这里提供两种方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//solution A:
int solveA(int x){
int ret=0;
while(x){
if(x%2==1) ret++;
x/=2;
}
return ret;
}
//Sloution ex_A:
int EX_solveA(int x){
int ret;
while(x){
if(x&1) ret++;
x>>=1;
}
return ret;
}

当然,上面的方法是有问题的,对于正整数自然是没有问题,但对于负数,符号位会自动补 1,例如 0X80000000 右移一位,是0Xc0000000,而不是0x40000000;

The correct solution:测试法

1
2
3
4
5
6
7
8
9
//Solution C
int solveC(int x){
unsigned p=1,ret=0; // 此处一定要是unsigned,可以思考下Why。
while(p){
if(x&p) ret++;
p<<=1;
}
return ret;
}

下面提供一个,第一次get到的方法

1
2
3
4
5
6
7
8
9
//Solution D
int solveD(int x){
int ret=0;
while(x){
ret++;
x=x&(x-1);
}
return ret;
}

说明:x-1,相当于把x数最右边的‘1’,和其右边的位全部取反,然后和x进行AND操作,相当于讲最右边的‘1’置为‘0’。

\^_^这个方法可以一步判断一个正整数,是不是2的整数次幂


END