题目
输入一个整数,输出该数二进制表示中 1 的个数。其中负数用补码表示。
分析
这是一道考察二进制的题目
二进制或运算符(or):符号为 |,表示若两个二进制位都为 0,则结果为 0,否则为 1。
二进制与运算符(and):符号为 &,表示若两个二进制位都为 1,则结果为 1,否则为 0。
二进制否运算符(not):符号为~,表示对一个二进制位取反。
异或运算符(xor):符号为 ^,表示若两个二进制位不相同,则结果为 1,否则为 0
左移运算符 m << n 表示把 m 左移 n 位,左移 n 位的时候,最左边的 n 位将被丢弃,同时在最右边补上 n 个 0,比如:
00001010<<2 = 00101000
右移运算符 m >> n 表示把 m 右移 n 位,右移 n 位的时候,最右边的 n 位将被丢弃,同时在最左边补上 n 个 0,比如:
00001010>>2 = 00000010
我们可以让目标数字和一个数字做与运算
这个用户比较的数字必须只有一位是 1 其他位是 0,这样就可以知道目标数字的这一位是否为 0。
所以用于比较的这个数字初始值为 1,比较完后让 1 左移 1 位,这样就可以依次比较所有位是否为 1。
代码
function NumberOf1(n)
{
let flag = 1;
let count = 0;
while(flag){
if(flag & n){
count++;
}
flag = flag << 1;
}
return count;
}