1. 程式人生 > >記錄一個演算法題(java程式碼):統計正整數n的二進位制寫法中有多少個1

記錄一個演算法題(java程式碼):統計正整數n的二進位制寫法中有多少個1

package ludims.main;

import java.util.Scanner;

public class myMain {
    public static void main(String[] args) {
        System.out.println("統計正整數n的二進位制寫法中有多少個1"); //題幹        
        Scanner in =new Scanner(System.in); //宣告一個Scanner物件,接收鍵盤輸入內容
        System.out.println("請輸入一個整數:"); //提示輸入資料
        while(in.hasNextLong()) {
            long num = in.nextLong();
            if(num >= 0) {
                System.out.println(num + "二進位制寫法中有 " + count1num(num) + "個1");  //輸出計算結果
                System.out.println("請再輸入一個整數:"); //提示輸入資料
            }else {
                System.out.println("輸入的不是正整數,請重新輸入正整數:"); //提示輸入了負數
            }
        }
        in.close(); //關閉Scanner
        System.out.println("輸入格式不對,程式結束!"); //程式結束提示
    }
    
    /**
     * 統計正整數n的二進位制寫法中有多少個1
     * @param n
     * @return count
     * 使用演算法:如n=9 (二進位制寫法1001) ,則n-1=8 (二進位制寫法1000),
     * 1001 & 1000 後結果為1000,即去掉了最右端的1,
     * 1000 再& 0111 結果為0000,如此統計迴圈的次數即可
     */
    static int count1num( long n) {
        int count;
        for(count = 0 ; n > 0; ++count) {  //每次將最後右端的1轉換成0,迴圈統計1的個數
            n &= (n-1);  //位運算
        }
        return count;
    }
}