- 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
方法1
先判断最右边一位是不是1,在将二进制往右边移动一位,如此循环
int numberOF(int n){
int count = 0;
while(n){
if(n & 1){
count++;
n = n>>1;
}
但是会越到一个问题,如果函数输入是一个负数,比如0X80000000,负数网友移动一位的时候并不是简单的移动,因为负数的最高位是符号标记位,所以会出错.
- 另外为什么与1而不是除以2呢,从数学上来说是一样的运算?
因为与的效率比除法效率高,一般工作中尽量用与代替除法.
方法2
既然不能将输入参数简单的向右移动,那么就将与的flag向左移动把
class Solution {
public:
int NumberOf1(int n) {
int count = 0;
unsigned int flag = 1;
while(flag){
if(n&flag){
count++;
}
flag = flag <<1;
}
return count;
}
};