剑指Offer--------请实现一个函数, 输入一个整数,输出该数二进制表示中1的个数。

一.所需知识储备:

 1.&运算: 

二进制中,只有0、1两种数字。有如下

第一个输入

第二个输入

输出结果

1

1

1

1

0

0

0

1

0

0

0

0

可见,只有前后两个运算数都是 1 的时候结果才是1。其效果与“或”相逆,各有不同用途。

2.“与运算”的特殊用途:

(1)清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。

(2)取一个数中指定位

方法:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。

例:设X=10101110,

取X的低4位,用 X & 0000 1111 = 0000 1110即可得到;

还可用来取X的2、4、6位。

3、n&(n-1)发生了什么

①、二进制数n,n-1后,如果最后一位是0,将向前一位借2,2-1=1。最后一位为1。如果前一位为0,将继续向前一位借2,加上本身少掉的1.则变为1。一直遇到1。减为0.

所以 二进制 xxxx10000-1 = xxxx01111

②、n&n-1

按照上述 n=xxxx10000,n-1=xxxx01111

xxxx10000

xxxx01111

xxxx0000

可以看到将原来的最右边的1变为0了。

重复操作,有多少个1,这个操作就可以执行多少次。

 

二. 回归正题

请实现一个函数, 输入一个整数,输出该数二进制表示中1的个数。

/**
     * 请实现一个函数, 输入一个整数,输出该数二进制表示中1的个数。
     * 例如把9表示成二进制是1001 ,有2位是1. 因此如果输入9,该出2。
     * 【这种方法的效率更高】
     *
     * @param n 待的数字
     * @return 数字中二进制表表的1的数目
     */
    public static int numberOfOne2(int n) {
        // 记录数字中1的位数
        int result = 0;

        // 数字的二进制表示中有多少个1就进行多少次操作
        while (n != 0) {
            result++;
            // 从最右边的1开始,每一次操作都使n的最右的一个1变成了0,
            // 即使是符号位也会进行操作。
            n = (n - 1) & n;
        }

        // 返回求得的结果
        return result;
    }

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值