// 求二进制数中1的个数
public class Test_006
{
public static void main(String[] args)
{
int number = 123;
int total = 0;// 记录1的个数
System.out.println("数字为:" + number);
System.out.println("数字二进制形式为:" + Integer.toBinaryString(number));
System.out.println("------------------");
// 解法一,每次与2求余,看是否为奇数,是的话就累计加一,最后这个结果就是二进制表示中1的个数。
while (number > 0)
{
if (number % 2 == 1)
{
total++;
}
number /= 2;
}
System.out.println("解法一数字中1的个数:" + total);
System.out.println("------------------");
// 解法二,同样用到一个循环,只是里面的操作用位移操作简化了。
number = 123;
total = 0;
while (number > 0)
{
total += number & 1;
number >>= 1;
}
System.out.println("解法二数字中1的个数:" + total);
System.out.println("------------------");
// 解法三,用到一个巧妙的与操作,v & (v -1 )每次能消去二进制表示中最后一位1,利用这个技巧可以减少一定的循环次数。
number = 123;
total = 0;
while (number > 0)
{
number &= (number - 1);
total++;
}
System.out.println("解法三数字中1的个数:" + total);
System.out.println("------------------");
// 解法四,查表法,因为只有数据8bit,直接建一张表,包含各个数中1的个数,然后查表就行。复杂度O(1)。
// 直接把所有结果记录在一个数组中,然后根据需要查询即可、
}
}