1. 程式人生 > >計算1個數--計算一個整數二進位制位中1的個數。要求效率儘可能的高。且能正確求正數和負數的二進位制中1的個數。

計算1個數--計算一個整數二進位制位中1的個數。要求效率儘可能的高。且能正確求正數和負數的二進位制中1的個數。

錯誤方法:
數字右移,這裡會涉及到移位的規則。
移位規則:
左移運算子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; }

這裡寫圖片描述