(19.1.6)
剑指offer(11)二进制中1的个数
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
我一开始想着转换为二进制再遍历一遍32位0,1串的。但发现负数的补码挺麻烦的,就换了个角度。
toString(2)可以转为二进制,但负数也仅仅加了个负号。
所以另一种方法,n&n-1
n-1时
xxxxx11110要向前借个2所以结果为xxxxx11101,是0的话继续往前借。
n&n-1时
xxxx11000&xxxx1001会把第一个n的从右数第一个1变为0,所以n = n&n-1时,count++就可以求出1
的个数。
代码如下:
function NumberOf1( n) {
var count=0;
while(n)
{
n=n&n-1;
++count;
}
return count;
}
console.log(NumberOf1(-1));