题目一:请实现一个函数,输入一个整数,输出该数二进制表示中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"); } } }
运行结果: