二进制中1的个数

题目描述:

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

知识点

  • 使用&等运算符的时候,会自动转化成二进制进行运算。

n&1:将n的二进制与1的二进制进行与比较,因为1只有最后一位为1,所以如果n的最后一位为1,n&1==1,此方式可以用来判断n是否为偶数。

原码:第一位表示符号, 其余位表示值。

[+1]原 = 0000 0001

[-1]原 = 1000 0001

反码:正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

补码:正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

[+1] = [00000001]原 = [00000001]反 = [00000001]补

[-1] = [10000001]原 = [11111110]反 = [11111111]补

补码可以使计算机只使用加法,并将符号位参与运算, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127]

  • 逻辑右移就是不考虑符号位,右移一位,左边补零即可;算术位移需要考虑符号位,右移一位,若符号位为1,就在左边补1,;否则,就补0。

思路分析

参考了https://blog.csdn.net/qq_40608516/article/details/90453767 其中提供了三种方式,选取两种。

1.使用逻辑位移,如果当前位为1,则计数+1

function NumberOf1(n)
{
    // write code here
    var num=0;
    while(n!=0){
        if((n&1)==1){
            num++; 
        }
        n = n>>>1;
    }
    return num;
}

2.如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响.

function NumberOf1(n) {
    var count = 0;
    while (n != 0) {
        ++count;
        n = (n - 1) & n;
    }
    return count;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值