有一个八位的二进制数,求该二进制数中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;
}
}