概念
左移運(yùn)算符m<<n 表示把m 左移n位。左移n位的時(shí)候,最左邊的n位將被直接的丟棄,同時(shí)在最右邊補(bǔ)n個(gè)0 。
Paste_Image.png
左移運(yùn)算符m>>n 表示把m右移n位。右移n位的時(shí)候,最右邊的n位將被直接的丟棄,同時(shí)在最左邊補(bǔ)n個(gè)符號(hào)位 。
Paste_Image.png
方法一:
int NumberOf1(int n){
int count=0;
while(n){
if(n&1)
count++;
n>>1;
}
}
缺點(diǎn):
由于負(fù)數(shù)的右移在最高位變?yōu)?,所以一直右移會(huì)導(dǎo)致整個(gè)負(fù)數(shù)全部變?yōu)?,所以,從而陷入死循環(huán)。
方法二
int NumberOf1(int n){
int flag=1;
int count=0;
while(flag){
if(flag&n)
count++;
flag<<1;
}
return count;
}
缺點(diǎn):不管有沒有1都需要右移,32位整數(shù)需要移位3先次。
int NumberOf1(int n){
int count=0;
while(n){
++count;
n=n&(n-1);
}
return count;
}
最佳解法:把一個(gè)整數(shù)和整數(shù)減1之后的值做與,會(huì)把這個(gè)整數(shù)最右邊的1變?yōu)?。