位运算-二进制中1的个数(三种解法)

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

  运行结果:

    

原文地址:https://www.cnblogs.com/xiaoyh/p/10249006.html