问题
输入一个整数,输出该数二进制示意中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;
}