题目一:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。如9的二进制表示为1001,有2位是1.
实例代码:
import java.util.Scanner;
public class 二进制中1的个数 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
System.out.println(Integer.toString(N,2)); // 输出二进制数
//解法一
int count = 0;
// 比对每一位
for (int i = 0; i < 32; i++) {
if ((N&(1<<i))==(1<<i)) {
count++;
}
}
System.out.println(count);
//解法二
count = 0;
for (int i = 0; i < 32; i++) {
if (((N>>>i)&1)==1) { // >>> 运算符用 0 填充高位;>> 运算符用符号位填充高位,没有<<<运算符
count++;
}
}
System.out.println(count);
//解法三 把一个整数n减去1,再和原来的整数与运算,会把该整数的最右边的1变成0,
// 那么,一个整数的二进制中有多少个1,就可以进行多少次这样的操作。循环结束的条件是n为0
count = 0;
while(N!=0){
N = ((N-1)&N);
count++;
}
System.out.println(count);
}
}
运行结果:

题目二:用一条语句判断一个整数是不是2的整数次方。
思路:一个整数如果是2的整数次方,那么它的二进制表示中有且仅有一个位是1,而其他所有位都是0,根据上面解法三的分析,把这个整数减去1后再与自己相与,唯一的1也会变成0.注意这里不用考虑2的-1次方之类,因为2的-1次方等与0.5,是一个浮点数,与题目不符。
实例代码:
import java.util.Scanner;
public class Test {
// 异或运算
public static void main(String args[]){
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
System.out.println(Integer.toString(N,2));
if (((N-1)&N)==0) { // 关键一条语句
System.out.println("True");
}else {
System.out.println("False");
}
}
}
运行结果:
