計算1個數--計算一個整數二進位制位中1的個數。要求效率儘可能的高。且能正確求正數和負數的二進位制中1的個數。
阿新 • • 發佈:2018-12-27
錯誤方法:
數字右移,這裡會涉及到移位的規則。
移位規則:
左移運算子m<<表示把m左移n位。左移n位的時候,最左邊的n位將被丟棄,同時在右邊補上n個0;
右移比左移稍微複雜一些,如果數字是一個無符號值或正數,右移時最左邊補0;
如果數字是一個負數,則最左邊補1。
//以下是有缺陷的寫法
//如果給一個負數,則右移右邊會一直補1,會導致死迴圈。
int CountOf1(int n)
{
int count = 0;
while(n){
if(n & 1)
count++;
n=n>>1 ;
}
return count;
}
方法一:不移數字,只移比較的1
//如果數字是32位,則最多隻用比較32次
int CountOf1(int n)
{
int count = 0;
unsigned int flag = 1;
while(flag){
if(n & flag)
count++;
flag = flag<<1;
}
return count;
}
方法二:與運算
//(有幾個1就會迴圈幾次)
int CountOf1(int num)
{
int count = 0;
while(num)
{
++count;
num = num & (num-1);
}
return count;
}