快秋招啦,开始在牛客网上刷题,自己是渣渣,只能说任重而道远。
题目
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
这个代码通过率只有55%
后来我在网上找了别人通过的代码,发现自己没有考虑到负数的情况,
js无符号右移运算符的知识,需要补充一下:
该>>>运算符由三个大于号构成,是一个二进制运算符。
也就是对二进制数字进行操作,具有两大特点:
(1).首先,是无符号。
(2).其次,是右移。
二进制正负数表示法与十进制不同,十进制前面使用正负号表示(正号可以省略)。
二进制数字的最高位是符号位,正数的最高位是0,负数的最高位是1。
00000000000000000000000011111111
上面是32位二进制数字,转换成十进制是255。
所谓的右移是将二进制数字整体向右平移,但是位数保持不变。
也就是向右移动一位,那么右边的数字就会被切割掉一位,在左边再补充一位。
假如向右移动六位,上述二进制数字变为:
00000000000000000000000000000011
原来二进制数字的右边的六个1将被切掉,左边会补充6个0。
所谓的无符号,就是无论被右移的数字是正数还是负数,右移后,左边空出来的位用0填充。
这是修改后的,该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,左侧用0填充。因为符号位变成了 0,所以结果总是非负的。(译注:即便右移 0 个比特,结果也是非负的。即先将负数转化为很大的整数,再统计该整数中含有的1的个数