1. 程式人生 > >劍指Offer之二進制中1的個數

劍指Offer之二進制中1的個數

基於 不變 () 分析 private [] 一位 code 一個數

 思路分析:

  首先分析把一個數減去1的情況,如果一個整數不等於0,那麽改整數的二進制表示其中至少有一位是1.先假設這個數的最右邊是1,那麽減去1時,最後一位變成0而其他所有位都保持不變。也就是最後一位相當於做了取反操作,由1變成了0。

  接下來假設最後一位不是1而是0的情況。如果該整數的二進制表示中最右邊1位位於第m位,那麽減去1時,第m位由1變成0,而第m位之後的所有0都變成1,整數中第m位之前的所有位都保持不變。舉個例子:一個二進制數1100,它的第二位是從最右邊數起的一個1.減去1之後,第二位變成0,它的後兩位0變成1,而前面的1保持不變,因此得到的結果是1011。

  在前面兩種情況中,我們發現把一個整數減去1,都是把最右邊的1變成0.如果它的右邊還有0的話,所有的0都變成1,而它左邊所有位都保持不變。接下來我們把一個整數和它減去1的結果做與運算,相當於把它最右邊的1變成0.還是以前面的1100為例,它減去1的結果是1011.我們再把1100和1011做位於運算,得到的結果是1000.我們把1100最右邊的1變成了0,結果剛好是1000。

  我們把上面的分析總結起來就是:把一個整數減去1,在和原整數做與運算,會把該整數的最右邊一個1變成0.那麽一個整數的二進制表示中有多少個1,就可以進行多少次這樣的操作。基於這種思路,代碼如下:

import java.util.Scanner;

/**
 * Created by Feng on 2017/5/6.
 * 輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼表示。
 */
public class NumberOf1InBinary {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
while (sc.hasNext()) { int n = sc.nextInt(); int result = numberOf1(n); System.out.println(result); } } private static int numberOf1(int n) { int count = 0; while (n != 0) { ++count; n = (n - 1) & n; }
return count; } }

劍指Offer之二進制中1的個數