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