位運算
題目:
請實現一個函數,輸入一個整數,輸出該數二進制表示中1的個數。例如,把9表示成二進制是1001,有2位是1因此,如果輸入9,則該函數輸出2。
分析:
tips:負數在移位後仍爲負數,最高位爲1,1移位後,最高位的符號位仍爲1。
數字右移,判斷第一位爲1的個數,直到數變爲零,類似於十進制轉二進制的數學算法,但不適用於負數。
修改爲,把1左移,每次判斷一位,直到1變成0。
代碼如下:
int NumberOf1(int n)
{
unsigned int flag = 1;
int count = 0;
while(flag){
if(n & flag)
count++;
flag = flag<<1;
}
return count;
}
第二種,數n,對它作n&(n-1)的操作,會把它二進制中第一個1去掉。比如,
n = 1101,
n-1=1100,
n=n&(n-1)=1100
繼續:
n=1100,
n-1=1011,
n&(n-1)=1000
……
直到n變成0;
代碼如下:
int numberof1(int n )
{
int count = 0;
while(n){
n = n&(n-1);
count++;
}
return count;
}
聲明:題目和程序來自劍指offer,分析和註釋自己寫的備忘,侵刪