####11.二进制中1的个67767
Pro:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
感觉还是比较有意思,如果是正整数自然好求,这里提供两种方法:
1 | //solution A: |
当然,上面的方法是有问题的,对于正整数自然是没有问题,但对于负数,符号位会自动补 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的整数次幂