牛客题解 | 二进制中1的个数

题目

题目链接

题目的主要信息:
  • 统计32位整型有符号数二进制中1的个数
  • 因负数用补码表示,故不能用连除法
举一反三:

学习完本题的思路你可以解决如下题目:

JZ64. 求1+2+3+…+n

JZ65. 不用加减乘除做加法

方法一:循环按位比较法(推荐使用)

知识点:位运算

计算机的数字由二进制表示,我们平常的运算是对整个数字进行运算,但是还可以按照二进制的每一位分别进行运算。常见运算有位与、位或、移位、位异或等。

思路:

我们可以检查该数字的二进制每一位是否为1,如果遍历二进制每一位呢?可以考虑移位运算,每次移动一位就可以。至于怎么统计到1呢?我们都只知道数字1与数字相位与运算,其实只是最后一位为1就是1,最后一位为0就是0,这样我们只需要将数字1移位运算,就可以遍历二进制的每一位,再去做位与运算,结果为1的就是二进制中为1的。

具体做法:

  • step 1:遍历二进制的32位,通过移位0-31次实现。
  • step 2:将移位后的1与数字进行位与运算,结果为1就记录一次。

Java实现代码:

public class Solution {
   
   
    public int NumberOf1(int n) {
   
   
        int res = 0;
        //遍历32位
        for(int i = 0; i < 32; i++){
   
   
            //按位比较
            if((n & (1 << i)) != 0)   
                res++;
        }
        return res;
    }
}

C++实现代码:

class Solution {
   
   
public:
    int  NumberOf1(int n) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值