題目:請實現乙個函式,輸入乙個整數,輸出該整數二進位制中1的個數。例如把9表示成二進位制位1001,因此如果輸入9,則該函式返回2.
在劍指offer上,對於此問題提供了三種解題思路,第一種解題思路不能適應於負數,第二種解題思路還是有一點小問題的,我們在這裡只給出第三種也是效率最高的一種解題思路。
如果乙個數不為0,那麼該整數的二進位制中至少有一位是1。
假設最後一位是1,那麼次數如果減去1,最後一位就會變為0,其他各位保持不變,相當於這個數的最後一位做了取反的操作。
如果1不在最後一位,而是在第m位,那麼減去1時,第m位由1變為0,而第m位後面的所有的0都變為了1,m位之前的數保持不變。例如乙個二進位制數字1100,那麼減去1之後它會變為1011。
因此我們可以發現,把乙個整數減去1,都是把最右邊的1變為0,如果它右邊還有0的化,會把0變為1.,而前面的數保持不變。
接下來,我們把乙個整數和它減去1的結果做與運算,相當於把最右邊的1變為了0。例如1100,減去1之後位1011,這兩個數做與運算會得到1000.
將上面的思路總結起來就會得到這樣一種思路:把乙個整數減去1,再和原來的數做與運算,就會把最右邊的乙個1變為0,那麼乙個整數中由多少個1,就可以迴圈執行多少次這樣的操作。
int numberof1(int n)
return count;
}
測試用例:
cout << numberof1(9) << endl;
cout << numberof1(1) << endl;
cout << numberof1(0x7fffffff) << endl;
cout << numberof1(0) << endl;
結果:
劍指offer題10 二進位制中1的個數
請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如把9表示成1001,有2位是1。因此如果輸入9,該函式輸出2。1.可能引起死迴圈的解法 判斷輸入的整數最右一位是否為1,然後迴圈右移,但是問題是如果輸入的整數是乙個負數,那麼迴圈右移就會變成死迴圈。2.常規解法 將輸入的整數不進行右移...
劍指Offer 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。1 可能引起死迴圈的解法 先判斷整數二進位制表示中最右邊一位是不是1。接著把輸入的整數右移一位,此時原來處於從右邊數起的第二位被移到最右邊了,再判斷最右邊的...
劍指Offer 二進位制中1的個數
輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。錯誤解法 public class solution return num 若輸入的數字為負數,因為為補碼表示方式,所以高位一直是1,所以會陷入死迴圈。方法一 從高位開始計算 public class solution return ...