整數二進位制表示中1的個數

2021-06-14 13:25:36 字數 2045 閱讀 9078

**:

出自:

題目:輸入乙個整數,求該整數的二進位制表達中有多少個1。例如輸入10,由於其二進位制表示為1010,有兩個1,因此輸出2。

分析:這是一道很基本的考查位運算的面試題。包括微軟在內的很多公司都曾採用過這道題。

乙個很基本的想法是,我們先判斷整數的最右邊一位是不是1。接著把整數右移一位,原來處於右邊第二位的數字現在被移到第一位了,再判斷是不是1。這樣每次移動一位,直到這個整數變成0為止。現在的問題變成怎樣判斷乙個整數的最右邊一位是不是1了。很簡單,如果它和整數1作與運算。由於1除了最右邊一位以外,其他所有位都為0。因此如果與運算的結果為1,表示整數的最右邊一位是1,否則是0。

得到的**如下:

///// get how many 1s in an integer's binary expression

///int

numberof1_solution1(int i)

return count;}

可能有讀者會問,整數右移一位在數學上是和除以

2是等價的。那可不可以把上面的**中的右移運算子換成除以

2呢?答案是最好不要換成除法。因為除法的效率比移位運算要低的多,在實際程式設計中如果可以應盡可能地用移位運算子代替乘除法。

這個思路當輸入

i是正數時沒有問題,但當輸入的

i是乙個負數時,不但不能得到正確的

1的個數,還將導致死迴圈。以負數

0x80000000

為例,右移一位的時候,並不是簡單地把最高位的

1移到第二位變成

0x40000000

,而是0xc0000000

。這是因為移位前是個負數,仍然要保證移位後是個負數,因此移位後的最高位會設為

1。如果一直做右移運算,最終這個數字就會變成

0xffffffff

而陷入死迴圈。

為了避免死迴圈,我們可以不右移輸入的數字

i。首先i和

1做與運算,判斷

i的最低位是不是為

1。接著把

1左移一位得到

2,再和

i做與運算,就能判斷

i的次高位是不是

1……這樣反覆左移,每次都能判斷

i的其中一位是不是

1。基於此,我們得到如下**:

///// get how many 1s in an integer's binary expression

///int

numberof1_solution2(int i)

return count;}

另外一種思路是如果乙個整數不為

0,那麼這個整數至少有一位是

1。如果我們把這個整數減去

1,那麼原來處在整數最右邊的

1就會變成

0,原來在

1後面的所有的

0都會變成

1。其餘的所有位將不受到影響。舉個例子:乙個二進位制數

1100

,從右邊數起的第三位是處於最右邊的乙個

1。減去

1後,第三位變成

0,它後面的兩位0變成

1,而前面的

1保持不變,因此得到結果是

1011。

我們發現減

1的結果是把從最右邊乙個

1開始的所有位都取反了。這個時候如果我們再把原來的整數和減去

1之後的結果做與運算,從原來整數最右邊乙個

1那一位開始所有位都會變成0。如

1100&1011=1000

。也就是說,把乙個整數減去

1,再和原整數做與運算,會把該整數最右邊乙個1變成

0。那麼乙個整數的二進位制有多少個

1,就可以進行多少次這樣的操作。

這種思路對應的**如下:

///// get how many 1s in an integer's binary expression

///int

numberof1_solution3(int i)

return count;

}

整數的二進位制表示中1的個數

給出通常能想到的方式,這兩種方式在 c和指標 一書中給出。以下討論的均為非負整數。該方法每次在迴圈中判斷數的二進位制最右一位是否為1 如果該數能不能被2整除 每次迴圈後該數右移一位。因此遍歷了數的二進位制表示的每一位。int count one bits1 int value 與上邊方法類似,也是每...

整數的二進位制表示中1的個數

題目 輸入乙個整數,求該整數的二進位制表達中有多少個1。例如輸入10,由於其二進位制表示為1010,有兩個1,因此輸出2。分析 這是一道很基本的考查位運算的面試題。包括微軟在內的很多公司都曾採用過這道題。乙個很基本的想法是,我們先判斷整數的最右邊一位是不是1。接著把整數右移一位,原來處於右邊第二位的...

整數的二進位制表示中 1 的個數

2019獨角獸企業重金招聘python工程師標準 輸入乙個整數,求該整數的二進位制表達中有多少個 1。例如輸入 10,由於其二進位制表示為 1010,有兩個 1,因此輸出 2。解法一是普通處理方式,通過除二餘二統計1的個數 解法二與解法一類似,通過向右位移依次處理,每次與1按位與統計1的個數 解法三...