概念
左移運(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è)符號位 宇攻。
Paste_Image.png
方法一:
int NumberOf1(int n){
int count=0;
while(n){
if(n&1)
count++;
n>>1;
}
}
缺點(diǎn):
由于負(fù)數(shù)的右移在最高位變?yōu)?,所以一直右移會導(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之后的值做與,會把這個(gè)整數(shù)最右邊的1變?yōu)?固耘。