(3)二进制中1的个数

本文介绍了计算二进制中1的个数的三种方法,包括直接计数法、按位与运算法和消除1的方法。通过这些方法,可以有效地找出整数在二进制表示中1的个数,并提供了相应的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

法1:

 知识点:

1<<i:      是将1左移i位,第i位为1,其余为为0
N&(1<<i):  N与左移后的i按位与 
这样会有两个结果:
1.如果N的第i位为0,则其为0(全0) 
2.保留N的第i位,其余位置为0
Scanner sc =new Scanner(System.in);
int N=sc.nextInt();
/*创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,输入的内容传给Scanner

next() 只读取到空格之前的数据
[读取完后把光标放在读取数据的同一行,该数据的后面]

nextInt()只能读取整数类型
[光标放在读取数据的同一行,该数据的后面]

nextLine()读取整行的数据包括单词间的空格,到回车结束(也就是从开始读一整行包括回车)
[光标放在下一行开头]*/

System.out.println(Integer.toString(N, 2));
//Integer.toString(int par1,int par2):par1表示 转成字符串的数字,par2表示 转成的进制表示
//Integer.toString(22,2):表示把22转成2进制表示的字符串,
int count =0;
//count来计数,比对每一位

for(int i=0;i<32;i++)
{
	if((N&(1<<i))==(1<<i)) {
		count++;
	}
    //都把1移动到相应的位与N作与运算 N&(1<<i)
    //如果这一位是1,那么恰好 等于 1移位的数值(1<<i),则计数
}
System.out.println(count);
//单个位次地比较,检测到1就进行count的计数

法2:

将N和1进行按位与运算,可以得出最低位

结果为1,最低位为1;

结果为0,最低位为0,然后循环将N右移一位进行运算。

int count =0;
for(int i=0;i<32;i++)
{
	if((N&1)!=0){count++;}
		N=N>>>1; //“>>>”表示无符号右移
}

法3:

思想:开始消除1,消除1的个数就是1的个数

最后一个1会往回借,而后面的0会全变成1   :8(1000) 减一得7(0111)

原数10100
原数-110011
原数&(原数-1)10000

 (x-1)&x 的效果就是 消去最低位的1

count =0;
while(N!=0)
{
	N=((N-1)&N);
	count++;
}
System.out.println(count);

完整代码:

法1:

import java.util.Scanner;
public class a {
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		int N=sc.nextInt();
		System.out.println(Integer.toString(N, 2));
		int count =0;
		for(int i=0;i<32;i++)
		{
			if((N&(1<<i))==(1<<i)) {//计算时,N是以二进制来参与运算的
				count++;
			}
		}
		System.out.println(count);
	}
}

法2:

import java.util.Scanner;
public class a {
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		int N=sc.nextInt();
		System.out.println(Integer.toString(N, 2));
		int count =0;
		for(int i=0;i<32;i++)
		{
			if((N&1)!=0){count++;}
				N=N>>>1; //“>>>”表示无符号右移
		}
		System.out.println(count);
	}
}

法3:

import java.util.Scanner;
public class a {
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		int N=sc.nextInt();
		System.out.println(Integer.toString(N, 2));

		int count =0;
		while(N!=0)
		{
			N=((N-1)&N);
			count++;
		}
		System.out.println(count);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值