资源限制
时间限制:1.0s 内存限制:256.0MB
输入一个无符号整数x,输出x的二进制表示中1的个数.
输入:
76584
输出:
7
首先在java中有几个方法可以直接将一个整数转换为二进制数,分别为Integer.toBinaryString();
Integer.toString(N,2): 用第二个参数指定的基数返回第一个参数的字符串表示形式
方法一:短除法
import java.util.Scanner;
public class ToBinary {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
String string="";
char des='1';
int sum=0;
while (n!=0){ //转换为二进制
string=n%2+string;
n=n/2;
}
for (int i = 0; i <string.length() ; i++) { //判断'1'出现的次数
if(string.charAt(i) == des){
sum++;
}
}
System.out.println(sum);
}
}
方法二:位运算
import java.util.Scanner;
public class ToBinary {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int N=scanner.nextInt();
int sum=0;
System.out.println(Integer.toString(N,2)); //显示转换后的二进制数
for (int i = 0; i <32 ; i++) { //因为int型32位,故32次循环即可
if((N&(1<<i))==(1<<i)){ //用数字1不断向左移位和原数字进行与运算
sum++;
}
}
System.out.println(sum);
}
}
方法三:同样是位运算,但是更加巧妙
思考:例如整数12,二进制为1100;
1100-1=1011,原数1100&1011=1000(即把低位第一个1后的数全清零)
1000-1=0111,上一步1000&0111=0则终止,减一操作执行2次,则原数有两个1
结论:(原数-1)&原数,不断循环,当结果为0时结束,有多少次减一操作则有多少个1
import java.util.Scanner;
public class ToBinary {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int N=scanner.nextInt();
int sum=0;
System.out.println(Integer.toString(N,2)); //显示转换后的二进制数
while (N!=0){
N=(N-1)&N;
sum++;
}
System.out.println(sum);
}
}