題目描述
輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。
1、最容易也是容易死迴圈的一種解法
先判斷整數二進位制表示中最右邊的一位是不是1,接著把輸入的整數右移一位,此時處於最右邊數起的第二位被移到最右邊了,再判斷是不是1。這樣每次移動一位,直到整個整數變成0為止。
正數這樣是沒有問題的。但是負數右移是以1補位的,因此,會一直補1,陷入死迴圈。
class
solution
return count;}}
;
2、常規解法
為了避免死迴圈,可以不右移輸入的數字n,首先把n和1做與運算,判斷n的最低位是不是1,接著把1左移一位得到2,再和n做與運算,就能判斷n的次地位是不是1,這樣反覆左移,每次都能判斷n的其中一位是不是1
class
solution
return count;}}
;
3、能給面試官帶來驚喜的解法
嗯,先看看一種情況吧
如果乙個整數不等於0,那麼該整數的二進位制表示中至少有一位是1。
先假設這個數的最右邊一位是1,那麼減去1時,最後一位變成0,而其他位置都保持不變呀。也就是相當於最後一位做了取反操作,由1變成了0.
接著假設最後一位不是1而是0的情況,如果該數的二進位制表示中最右邊的1為於第m位,那麼減去1時,第m位由1變成0,而第m位之後的所有0都變成了1,整數中第m位之前的所有位都保持不變。
在前面兩種情況中,可以發現的是,把乙個整數減去1,都是把最右邊的1變成0.如果它的右邊還有0,則所有的0變為1,而它做左邊的所有位保持不變。
把乙個整數和它減為1的結果做位與運算,相當於把它的最右邊的1變成0.
以1100為例,減去1為1011,把1100和1011做位與運算。得到的結果是1000。
把右邊的1變成了0,結果就是1000
總結一下:
把乙個整數減去1,再和原整數做位與運算,會把該整數最右邊的1變成0.那麼乙個整數中有幾個1,就可以進行多少次這樣的操作。
class
solution
return count;}}
;
劍指Offer 十一 二進位制中1的個數
解法 如果乙個整數不為0,那麼這個整數至少有一位是1。如果我們把這個整數減1,那麼原來處在整數最右邊的1就會變為0,原來在1後面的所有的0都會變成1 如果最右邊的1後面還有0的話 其餘所有位將不會受到影響。舉個例子 乙個二進位制數1100,從右邊數起第三位是處於最右邊的乙個1。減去1後,第三位變成0...
劍指Offer(十一) 二進位制中1的個數 位運算
牛客網刷題筆記記錄。參考自 輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。如果乙個整數不為0,那麼這個整數至少有一位是1。如果我們把這個整數減1,那麼原來處在整數最右邊的1就會變為0,原來在1後面的所有的0都會變成1 如果最右邊的1後面還有0的話 其餘所有位將不會受到影響。舉個例...
十一 二進位制中1的個數
輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。如果乙個整數不為0,那麼這個整數至少有一位是1。如果我們把這個整數減1,那麼原來處在整數最右邊的1就會變為0,原來在1後面的所有的0都會變成1 如果最右邊的1後面還有0的話 其餘所有位將不會受到影響。舉個例子 乙個二進位制數1100,...