剑指offer-面试题10 二进制中 1 的个数

面试题 10:二进制中 1 的个数

题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如把 9 表示成二进制是 1001;有 2 位是 1,因此如果输入 9,函数输出 2.

思路

这个题本来我的思路是类比十进制的规则,设置一个计数变量count,初始值为0。然后用给的整数数和2进行取余操作,结果只有两种可能:0或1,如果结果是1,计数变量+1;如果是0,不操作。然后num /= 2(二进制右移一位,和十进制中数/=10后所有数右移一位的操作类似)。不断循环,直到这个数的值小于1,返回计数变量的值就能求出来。但是看了网上的一个利用二进制数‘&’操作性质的方法,也能得出正确答案,而且经过试验,速度比上面的思路运行更快,所以我们选择这种方法。不多说,看代码:

代码

package swordOffer;
/**
 * 剑指offer第10题
 * 题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如
 * 把 9 表示成二进制是 1001;有 2 位是 1,因此如果输入 9,函数输出 2.
 * 
 * @author someone
 *
 */
public class Ex10NumOf1InBinary2 {
    public static void main(String args[]) {
        Ex10NumOf1InBinary2 test=new Ex10NumOf1InBinary2();
        System.out.println(test.numberOf1(2147483647));
    }
    public int numberOf1(long n) {
        int count=0;
        while(n!=0) {
            count++;
            n=(n-1) & n;
        }
        return count;
    }
}   

代码十分简洁,而且效率很高。
下面是第一个思路的代码,相比简洁度和效率都差很多。

package swordOffer;
/**
 * 剑指offer第10题
 * 题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如
 * 把 9 表示成二进制是 1001;有 2 位是 1,因此如果输入 9,函数输出 2.
 * 
 * @author Stephen Huge
 *
 */
public class Ex10NumOf1InBinary {
    public static void main(String[] args) {
        Ex10NumOf1InBinary nob = new Ex10NumOf1InBinary();
        int ans = nob.numOf1InBinary(2147483647);
        System.out.println(ans);
    }
    public int numOf1InBinary(long num) {
        if(num < 0 || num > Long.MAX_VALUE) {
            return -1;
        }
        int count = 0;
        if(num % 2 == 0) {
            count++;
        }
        while(num >= 1) {
            if(num % 2 != 0) {
                count++;
            }
            num /= 2;
        }
        return count;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值