Sword15——二进制中1的个数

Sword15——二进制中1的个数

方法1——位运算

  • 思路:题目中是以二进制形式表示的数字,这也就提醒应该使用位运算。不仅如此,更重要的是因为找出一个数的中1的位数,必然要转化为二进制形式求解,这也暗示了使用位运算。统一思想就是通过消除最低位的1,并统计次数来求解
  • 常用的两种消除方式
    • 消除n最低位的1:n & (n - 1)
      • n为1000 0010,n - 1为1000 0001,进行与运算后得到结果为1000 0000,即消去最低位上的1
    • 获取n最低位的1:n & (~n + 1)
      • n为1000 0010,~n为0111 1101,~n + 1为0111 1110,进行与运算后得到结果为0000 0010,即得到最低位上的1
  • 特殊情况与临界分析:无
  • 终止条件:当n为0时,证明此数二进制中已无1
  • 步骤:
    • 定义结果
    • 循环条件:n不为0
    • while循环
      • 表达式消除最低位上的1
      • 结果数加1
    • 返回结果
    public int hammingWeight(int n) {
        // 定义结果
        int res = 0;
        // while循环
        while (n != 0) {
            // 消除最低位上的1
            n &= n - 1;
            // 结果数加1
            res++;
        }
        // 返回结果
        return res;
    }

方法1——位运算-消除

    public int hammingWeight(int n) {
        // 定义结果
        int res = 0;
        // while循环
        while (n != 0) {
            // 消除最低位上的1
            n -= n & (~n + 1);
            // 结果数加1
            res++;
        }
        // 返回结果
        return res;
    }

方法1——位运算-获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值