二进制数数 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
博文发布不易,各位博友留下你们的赞呗! ↩︎