題目:請實現乙個函式,輸入乙個整數,輸出該二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1,因此如果輸入9,該函式輸出2。
常規的解題思路:
可以把n和1做與運算,如果結果為1,那麼n的最後一位為1,否則為0,然後n右移1位,再和1做與運算,直到判斷完n的所有位。
int statisticsnums(int n)
n=n>>1;
}return sum;
}
上面**當傳入的引數為正數,能夠返回正確的值,但傳入的引數為負數時,就會陷入死迴圈,函式沒有辦法返回值。原因分析:
我們來看一下左移和右移運算的法則:
左移(<
右移(>>):右移n位,低位捨棄n位,當數為正數時,高位補n個0,當數為負數時,高位補n個1。因為在計算機組成原理中,符號位1表示負數,符號位0表示正數。
舉兩個栗子:
1.3<<2
假設整數3為int型別,那麼它佔4個位元組,也就是有32位,表示如下:
左移兩位後結果應該是這樣:
3<<2=12
2.9>>1
9的二進位制位:
9右移1位:
9>>1=4
可以看出來,在數學意義上,左移n位代表乘以2的n次方,右移n位代表除以2的n次方。
我們再來看一下計算機組成原理中是如何表示乙個負數的。
在計算機中為了減少操作,一般用數的補碼來表示乙個數。
正數的補碼=原碼
負數的補碼=負數正值的原碼取反+1
比如計算-9的補碼過程:
所以-9的二進位制補碼用16進製表示為0xfffffff7,
回到上面的問題,假設給函式傳入的引數為-9,那麼當-9經過4次右移1位後,結果將變成
結果用16進製表示就是0xffffffff,所以程式最終會陷入死迴圈。
為了避免死迴圈的出現,我們可以不讓n移動,而每次讓1左移1位,這樣結果也是一樣的。
int statisticsnums(int n)
return sum;
}
劍指Offer 面試題10 二進位制中1的個數
請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1.因此如果輸入9,該函式輸出2.注意 整數和負數以及0的區別,這是由儲存機制決定的。分析 將輸入的整數依次右移並與1相位與!源 如下 includeusing std cout using st...
劍指offer 面試題10 二進位制中 1 的個數
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如把 9 表示成二進位制是 1001 有 2 位是 1,因此如果輸入 9,函式輸出 2.這個題本來我的思路是模擬十進位制的規則,設定乙個計數變數count,初始值為0。然後用給的整數數和2進行取餘操作,結果只有兩種可能 0或1...
《劍指offer》(面試題10) 二進位制中1的個數
位運算 位運算是把數字用二進位制表示之後,對每一位上 0 或者 1 的運算。因為位運算總共只有五種運算 與,或,異或,左移和右移 與 0 0 0 1 0 0 0 1 0 1 1 1 或 0 0 0 1 0 1 0 1 1 1 1 1 異或 0 0 0 1 0 1 0 1 1 1 1 0 左移運算子 ...