现在的位置: 首页 > 综合 > 正文

编程之美_006求二进制数中1的个数

2012年11月13日 ⁄ 综合 ⁄ 共 882字 ⁄ 字号 评论关闭
// 求二进制数中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)。
        // 直接把所有结果记录在一个数组中,然后根据需要查询即可、
    }
}

抱歉!评论已关闭.