二進制中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;
}
}
運行結果: