題目描述
輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。
時間限制:1秒空間限制:32768k
知識點
位運算思路
1、先判斷整數二進位制表示中最右邊一位是不是1。接著把輸入的整數右移一位,此時原來處於從右邊數起的第二位被移到最右邊了,再判斷是不是1。這樣每次移動一位直到整個整數變成0 為止。現在的問題變成怎麼判斷乙個整數的最右邊是不是1了。這很簡單,只要把整數和1做位與運算看結果是不是0就知道了。1除了最右邊的一位之外所有位都是0。1除了最右邊的一位之外所有位都為0。如果乙個整數與1做與運算的結果是1,表示該整數最右邊一位位是1,否則是0。(劍指offer)
問題:如果是負數,則會陷入死迴圈。
**:
public class solution
return count;
}}
public class solution
return count;
}}
3、優解(幾個1迴圈幾次):
把乙個整數減去1,都是把最右邊的1變成00.如果它的右邊還有0的話,所有的0都變成1,而它左邊所有位都保持不變。接下來我們把乙個整數和它減去1的結果做位與運算,相當於把它最右邊的1變成0.還是以前邊的1100為例,它減去1的結果是1011。我們再把1100和1011做位與運算,得到的結果是1000。我們把1100最右邊的1變成了0,結果剛好就是1000.
總結一下:把乙個整數減去1,再和原整數做與運算,會把該整數最右邊乙個1變成0.那麼乙個整數的二進位制表示中有多少個1,就可以進行多少次這樣的操作。
**:
public class solution
return count;
}}
面試題10 二進位制中1的個數
方法一 判斷整數二進位制表示中最右邊一位是否為1,接著把整數右移一位判斷倒數第二位是否為1,以此類推,直到整數變成0為止。include stdafx.h include using namespace std int countof1 int n n n 1 return ncount int t...
面試題10 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。解法一 可能引起死迴圈 public int numberof1 int n return count 思路 如果乙個整數與1做與運算的結果是1,表示該整數...
面試題10 二進位制中1的個數
面試題10 特殊的情況是右移運算,m n。如果數字是乙個無符號數值,用0填補最左邊的n位。如果是有符號數值,用數字的符號位填補最左邊的n位。左移m 題目 實現乙個函式,輸入乙個整數,輸出該數中二進位制表示中1的個數。整數右移移位和除以2是等價的,但除法的效率比移位運算低得多。常規解法是 將n與1做與...