二進制中的1的個數 - Java實現

17. 二進制中的1的個數

問題描述

請實現一個函數,輸入一個整數,輸出該數二進制表示中1的個數。例如把9表示成二進制是1001,有2位是1。因此如果輸入9,該函數輸出2。

分析

一個數內部都是0 1 ,我們要檢測內部 1 的個數的話

我們可以將這個數不斷右移,直到它爲0 爲止,提一下,這個是錯誤的,正數可以做出來,負數呢,右移之後補1 ,死循環了啊,撲街

  • 常規解法

    我們可以設置一個數 從1 開始,不斷左移這個數,然後讓他和n做比較,如果不爲0 那就說明這個位上是1,這個方法有個缺點,就是循環的次數等於整數二進制中的位數,32位的整數需要循環32次

    public static int NumberOf1Solution2(int n) {
    	int count = 0;
        int flag = 1;
        while (flag >= 1) {
           if ((n & flag) > 0) {
                count++;
            }
            flag = flag << 1;
        }
        return count;
    }
    
  • 有幾個1就移動幾次

    假設我們 n = 3 換成二進制也就是 11 ,如果我們將這個數減1 判斷它是不是與(n)相與結果爲0的話,只需要減2次就行了剛好是其中1的個數,如果是 n = 4,也就是 100,我們將這個數減1(011),與(100)相與剛好爲0,所以這個數中只有一個1 。

    簡言之就是:把一個整數減去1,再和原整數做與運算,會把該整數最右邊一個1變成0。那麼一個整數的二進制表示中有多少個1,就可以進行多少次這樣的操作。

    public static int NumberOf1Solution3(int n) {
    	int count = 0;
    	while (n != 0) {
    		count++;
    		n = (n - 1) & n;
    	}
        return count;
    }
    

完整代碼:

import com.sun.org.apache.xpath.internal.operations.Number;

/**
 * Class day17 ...
 *
 * @author LiJun
 * Created on 2019/1/11
 */
public class day17 {
    private static int solution(int n) {
        int count = 0;
        while (n != 0) {
            count++;
            n = (n - 1) & n;
        }
        return count;
    }
    public static int NumberOf1Solution2(int n) {
        int count = 0;
        int flag = 1;
        while (flag >= 1) {
            if ((n & flag) > 0) {
                count++;
            }
            flag = flag << 1;
        }
        return count;
    }
    public static void main(String[] args) {

        System.out.println(solution(-1));
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章