题目描述:
输入一个整数,输出该数二进制表示中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;
}