10_二進制中1的個數

題目:輸入一個整數,輸出該數二進制表示中1的個數。

基本思路1(不可行):先判斷整數二進制表示中最右邊的一位是否爲1,接着把整數右移一位,再判斷該位是否爲1.這樣每次移動一位,直至整個整數變成0爲止。

如何判斷一個整數的最右邊一位是否爲1:如果一個整數與1做與運算結果爲1,則整數最右邊一位爲1。

該方法會導致出現死循環。當把一個負數右移一位時,不是簡單的把最高位的1移到第二位,而是最高位繼續補上1.如果一直做右移運算,做種會變成0xFFFFFFFF而陷入死循環。

基本思路2(可行):爲避免死循環,可以選擇不右移輸入的數字,而是把要進行與運算的1不斷左移。

基本思路3(可行):把一個整數的減去1,再和原整數做與運算,會把該整數最右邊的1變成0。那麼一個整數可以進行多少次這樣的運算,就有多少個1。

import java.util.Scanner;

public class NumberOf1 {

    //基本思路2
    public static int numberOf1_1(int n) {
        int count = 0;
        int flag = 1;

        while(flag!=0){
            if((n & flag)!=0)
                count++;

            flag = flag << 1;
        }
        return count;       
    }
    //基本思路3
    public static int numberOf1_2(int n) {
        int count = 0;

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

    public static void main(String[] args) {
        System.out.print("請輸入一個十進制整數:");
        Scanner sc = new Scanner(System.in);    
        int sc1 = sc.nextInt();
        System.out.println("該數的二進制爲:"+Integer.toBinaryString(sc1));
        System.out.println("思路1:該數的二進制中包含1的個數爲:"+numberOf1_1(sc1));
        System.out.println("思路2:該數的二進制中包含1的個數爲:"+numberOf1_2(sc1));
        sc.close();
    }
}

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

發佈了53 篇原創文章 · 獲贊 15 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章