請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1,因此如果輸入9,該函式輸出2.
思路:1:針對正數,把n左移:把整數和1做位與運算看結果是不是0就知道了。1除了最右邊的一位之外所有的位都是0(除法的效率比移位運算要低很多,在實際程式設計中應盡可能地用移位運算代替乘除法。)。如果是負數,比如0x80000000,執行的時候會發生什麼情況呢?把負數0x80000000右移一位的時候,並不是簡單地把最高位的1移到第二位變成0x40000000,而是0xc0000000.這是因為移位前是個負數,仍然保證移位是個負數,因此移位後的最高位會設為1.如果一直做右移位運算,最終這個數字會程式設計0xffffffff而陷入死迴圈。
2.每次把1右移:先把n和1做與運算,判斷n的最低位是不是1.接著把1左移一位得到2,再和n做與運算,就能判斷n的次低位是不是1。。。。這樣反覆左移,每次都能判斷n的其中一位是不是1.這個解法中迴圈的次數等於二進位制中的位數,32位的整數需要迴圈32次,下面我們再介紹乙個演算法,整數中有幾個1就只迴圈幾次
3.把乙個整數減去1,再和原整數做與運算,會把該整數最右邊的乙個1變成0.那麼乙個整數的二進位制表示中有多少個1,就可以進行多少次運算。
**1:
int numberof1(int n)
return
count;
}
**2:
int number1(int n)
return
count;
}
**3:
public
intnumberof1(int num)
return count;
} public
static
void
main(string args)
劍指Offer10 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出該二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。解題思路 常規的解法可以去遍歷整數對應二進位制的每一位,比如 數字9的二進位制1001,依次將每一位的數字與1進行 與 運算,若結果為1則表明對應的位數為1 ...
劍指offer 10 二進位制數字1的個數
輸入乙個int型數字,輸出它作為二進位制的1的個數。如9的二進位制為1001,有2個1,則輸出2。法一 因為int型有4個位元組,一共32位,每次將輸入右移1,並和1進行 與 操作。將結果累加,則為1的個數。public class test10 return result public stati...
劍指offer題10 二進位制中1的個數
請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如把9表示成1001,有2位是1。因此如果輸入9,該函式輸出2。1.可能引起死迴圈的解法 判斷輸入的整數最右一位是否為1,然後迴圈右移,但是問題是如果輸入的整數是乙個負數,那麼迴圈右移就會變成死迴圈。2.常規解法 將輸入的整數不進行右移...