二进制数数 Java (位运算的三种方法)

二进制数数 Java (位运算的三种方法)

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述:
  给定L,R。统计[L,R]区间内的所有数在二进制下包含的“1”的个数之和。
  如5的二进制为101,包含2个“1”。
输入格式:
  第一行包含2个数L,R
输出格式:
  一个数S,表示[L,R]区间内的所有数在二进制下包含的“1”的个数之和。
样例输入:
2 3
样例输出:
3
数据规模和约定
  L<=R<=100000;

代码:

import java.util.Scanner;

public class 二进制的1的个数三种解法
{

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 使用位运算求一个数里面二进制1的个数
		Scanner sc = new Scanner(System.in);

		/* 第一种解法 */
		int conut = 0;// 计数
		int num = sc.nextInt();// 输入一个数
		// 循环int型有32位
		for (int i = 0; i < 32; i++)
		{
			/*
			 * 使用1左移i位(左移<<),然后和数字num进行“与”运算, 如果等于1左移i位则count+1,与运算是:2个都为1才为1
			 */
			if (((1 << i) & num) == (1 << i))
			{
				conut++;
			}
		}
		System.out.println("第一种结果:");
		System.out.println(conut);
		System.out.println("=========");

		/* 第二种解法 */
		conut = 0;// 重新归零计数
		// 循环int型有32位
		for (int i = 0; i < 32; i++)
		{
			/*
			 * 使用num数右移i位(不带符号右移“>>>”),然后和数字1进行“与”运算,
			 * 如果等于1则count+1,与运算是:2个都为1才为1
			 */
			if (((num >>> i) & 1) == 1)
			{
				conut++;
			}
		}
		System.out.println("第二种结果:");
		System.out.println(conut);
		System.out.println("=========");

		/* 第三种解法 */
		conut = 0;// 重新归零计数
		// 循环最后num==0;
		while (num != 0)
		{
			/*
			 * (num-1)“与”num (会去掉最右边:二进制位的第一个1)
			 */
			num = (num - 1) & num;
			if (((num - 1) & num) == 0)
			{
				conut++;
			}
		}
		System.out.println("第三种结果:");
		System.out.println(conut);
	}

}

输入:

6

输出:

第一种结果:
2
=========
第二种结果:
2
=========
第三种结果:
2

1


  1. 博文发布不易,各位博友留下你们的赞呗! ↩︎

发布了17 篇原创文章 · 获赞 11 · 访问量 626

猜你喜欢

转载自blog.csdn.net/Hackergu/article/details/105133949