二進制中一的個數

二進制中1的個數

題目描述

輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼錶示。

思路一:
1.利用java對象封裝的方法Integer.toBinaryString()直接將整型數字轉換爲二進制,循環判斷即可。
2.看到大佬的思路,利用n和n-1與的運算來計算,很巧妙!!很多人不理解,我簡單想了下,相鄰倆個數的二進制的特點,減一會讓從左到右第一個不爲0的1消掉!!自己書寫樣例即可發現!

比較:思路二因爲直接消除1,所有比起思路1的全部比較會速度更快!但是也不完全是,因爲java的封裝方法並沒有轉換成32位的字符串,高位0不轉換,所有當數很小的時候,且二進制1比較多的時候,運行效率是差不多的。

代碼如下:

import java.util.Scanner;

public class O1 {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        long startTime = System.nanoTime();
        System.out.println(NumberOfOne1(n));
        long endTime1 = System.nanoTime();
        System.out.println("程序運行時間:" + (endTime1 - startTime) + "ns");
        System.out.println(NumberOfOne2(n));
        long endTime2 = System.nanoTime();
        System.out.println("程序運行時間:" + (endTime2 - endTime1) + "ns");
    }
    //利用Integer對象自帶的轉換字符串的方法依次判斷每一位。
    public static int NumberOfOne1(int n) {
        int count=0;
        String str=Integer.toBinaryString(n);
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)=='1'){
                count++;
            }
        }
        return count;
    }
    //利用倆個相鄰數的位運算消除一個1
    public static int NumberOfOne2(int n) {
        int count=0;
        while(n !=0){
            n=n & n-1;
            count++;
        }
        return count;
    }
}

運行結果:
運行結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章