概念
左移运算符m<<n 表示把m 左移n位。左移n位的时候,最左边的n位将被直接的丢弃,同时在最右边补n个0 。
左移运算符m>>n 表示把m右移n位。右移n位的时候,最右边的n位将被直接的丢弃,同时在最左边补n个符号位 。
方法一:
int NumberOf1(int n){
int count=0;
while(n){
if(n&1)
count++;
n>>1;
}
}
缺点:
由于负数的右移在最高位变为1,所以一直右移会导致整个负数全部变为1,所以,从而陷入死循环。
方法二
int NumberOf1(int n){
int flag=1;
int count=0;
while(flag){
if(flag&n)
count++;
flag<<1;
}
return count;
}
缺点:不管有没有1都需要右移,32位整数需要移位3先次。
int NumberOf1(int n){
int count=0;
while(n){
++count;
n=n&(n-1);
}
return count;
}
最佳解法:把一个整数和整数减1之后的值做与,会把这个整数最右边的1变为0。