求二进制数中1的个数

有一个八位的二进制数,求该二进制数中1的个数。

1、如果该二进制是无符号的,该怎么做?有三种方法,见代码注释。

2、如果该二进制是有符号的,该怎么做?如果是有符号的,想办法把有符号二进制数转换为相应的无符号二进制数。


使用java的byte类型来表示该二进制数,但是由于java的byte类型是带符号的。如何把signed byte转换为unsigned byte呢?

通过与0xFF进行位相与,用取值范围是0~255的int类型来表示unsigned byte。

/*
 * 求一个二进制数中1的个数,假设二进制数是八位
 * 如果二进制数是有符号的,需要转换为无符号的
 */
public class BinaryNumber1{

	public static void main(String[] args)
	{
		byte n1 = (byte)127;	//0111 1111		7个1
		byte n2 = (byte)-128;	//1000 0000		1个1
		byte n3 = (byte)0;		//0000 0000		0个1
		byte n4 = (byte)255;	//1111 1111		8个1
		byte n5 = (byte)244;	//1111 0100		5个1
		byte n6 = (byte)67;		//0100 0011		3个1
		byte n7 = (byte)-100;	//1001 1100		4个1
		
		System.out.println(count1(byteToUnsigned(n7)));
		System.out.println(count2(byteToUnsigned(n7)));
		System.out.println(count3(byteToUnsigned(n7)));
	}
	
	/*
	*java中的数据类型都是signed,把signed byte转换为unsigned byte
	*-128<= signed byte <= 127
	*0<= unsigned byte <= 255
	*/
	public static int byteToUnsigned(byte b)
	{
		return b & 0xFF;
	}

	//解法1:对2取余,如果等于1,说明最后一位是1,否则为0.
	public static int count1(int n)
	{
		int num = 0;
		while (n > 0)
		{
			if (n % 2 == 1)
				num++;
			n >>= 1;
		}
		return num;
	}

	//解法2:与00000001进行位相与,如果为1,则最后一位是1,否则为0
	public static int count2(int n)
	{
		int num = 0;
		while (n > 0)
		{
			num += (n & 0x1);
			n >>= 1;
		}
		return num;
	}

	//解法3:与n-1进行位相与,n中1的个数就减少1个
	public static int count3(int n)
	{
		int num = 0;
		while (n > 0)
		{
			n &= n-1;
			num++;
		}
		return num;
	}
	
}


欢迎批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值