面試題15 二進位制中1的個數

2022-08-03 15:09:17 字數 741 閱讀 3532

請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。

先判斷整數二進位制表示中最右邊一位是不是1;接著把輸入的整數右移一位,此時原來處於從右邊數第二位的數移到了第一位,再判斷是不是1;這樣每次移動一位,直到整個整數變為0為止。

缺點:如果乙個數是負數,那麼右移之後,左邊會用符號位1填充,這樣一直做右移運算的話,那麼最終整個數字就會變成0xffffffff而陷入死迴圈。

為了避免死迴圈,我們可以不右移輸入的整數n。首先把1和n做與運算,判斷n的最低位是不是1。接著把1左移一位得到2,在和2做與運算,就能判斷n的次低位是不是1……這樣反覆左移,每次都能判斷n的其中一位是不是1。

上面思路二中的解法,迴圈的次數等於整數中二進位制的位數,32位的整數需要迴圈32次。下面介紹的演算法,整數中有幾個1就只迴圈幾次。

把乙個整數減去1,再和原整數做與運算。會把該整數最右邊的1變成0,那麼乙個整數的二進位制中有多少個1,就可以進行多少次這樣的操作。

//

可能引起死迴圈的解法

int numberof1(int

n)

return

count;}//

常規解法

int numberof1(int

n)

return

count;}//

更好的解法

int numberof1(int

n)}

面試題15 二進位制中1的個數

題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。includeusing namespace std int numof1 int n flag flag 1 return count int main ...

面試題15 二進位制中1的個數

請實現乙個函式,輸入乙個整數,輸出該整數的二進位制表示中1的個數。例如,把9表示成二進位制是1001,有2個是1。因此,如果輸入9,則該哈數輸出2。如果輸入負數,則統計該數字二進位制補碼中的1的個數。先判斷二進位制中最右邊一位是不是1 接著把輸入的整數右移一位,此時原來處於從右邊數起第二位被移到最右...

面試題15 二進位制中1的個數

題目 請實現乙個函式,輸入乙個整數,輸出改數的二進位制表示中1的個數 常規解法 思路 通過與運算來判斷某乙個是否為1。該數先和1相與,如果結果為1,則第一位為1,然後1左移一位與該數相與,判斷第二位是否為1 以此類推,即可判斷該數的二進位制中有多少個1。int getnumofoneinbinary...