题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路:
1.用n和flag=1做与运算,如果是1,则计数加一,然后flag左移,重复以上操作直到32bit或者64bit的flag中的1移出去。
为什么左移?因为如果用n右移,当n为负数的时候,符号位会一直是1,陷入死循环
2.这种方法是书里看的,n&(n-1)就相当于n把最后面的1变成0,一直这么重复,只需要1的个数次循环就可以计算出1出现的次数。
比如10的二进制是1010,减去1是1001,相与运算为1000。
code
class Solution {
public:
//思路1
/*用n和flag=1做与运算,如果是1,则计数加一,然后flag左移,重复以上操作直到32bit或者64bit的flag中的1移出去。
为什么左移?因为如果用n右移,当n为负数的时候,符号位会一直是1,陷入死循环
*/
/* int NumberOf1(int n) {
int count=0;
unsigned int flag=1;
while(flag){
if(n&flag)
count++;
flag=flag<<1;
}
return count;
}*/
//思路2
/*这种方法是书里看的,n&(n-1)就相当于n把最后面的1变成0,一直这么重复,只需要1的个数次循环就可以计算出1出现的次数
比如10的二进制是1010,减去1是1001,相与运算为1000。
*/
int NumberOf1(int n) {
int count=0;
while(n){
++count;
n=n&(n-1);
}
return count;
}
};