Javascript 反向位:为什么';它给了我一个负值? var reverseBits=函数(n){ var-re=0; 对于(变量i=0;i>=1; } 返回re; };
这是我在Javascript中反转位的代码,但当n=1时,它给出-2147483648(-100000000000000000000000),它不应该是正数吗?我哪里错了 不应该是正数吗?我错在哪里 不,不应该。除Javascript 反向位:为什么';它给了我一个负值? var reverseBits=函数(n){ var-re=0; 对于(变量i=0;i>=1; } 返回re; };,javascript,bit-manipulation,bitwise-operators,Javascript,Bit Manipulation,Bitwise Operators,这是我在Javascript中反转位的代码,但当n=1时,它给出-2147483648(-100000000000000000000000),它不应该是正数吗?我哪里错了 不应该是正数吗?我错在哪里 不,不应该。除>之外的所有位运算符都使用有符号32位整数,其中前导1(两个补码)表示负数 正如@Icemanind所建议的,您可以使用>的无符号性来修复该问题,并将其“强制转换”为无符号整数: var reverseBits = function(n) { var re = 0; f
>
之外的所有位运算符都使用有符号32位整数,其中前导1(两个补码)表示负数
正如@Icemanind所建议的,您可以使用>
的无符号性来修复该问题,并将其“强制转换”为无符号整数:
var reverseBits = function(n) {
var re = 0;
for( var i = 0; i < 32; i++ ) {
re = (re << 1) | (n & 1);
n >>>= 1;
}
return re;
};
得到负数的原因是计算机存储负数和正数的方式。最高有效位(值最大的位)在符号数字中用于确定数字是负数还是正数。如果此位为
0
,则为正数。如果此位为1
,则为负数。计算机使用一种称为的技术将数字从负数转换为正数。其工作原理如下:
在您的示例中,您将编号1
分配给n
。在32位计算机中,二进制文件如下所示:
return re >>> 0;
0000 0000 0000 0000 0000 0000 0000 0001
1000 0000 0000 0000 0000 0000 0000 0000
1111 1111 1111 1111 1111 1111 1001 1111
反转位后,二进制文件如下所示:
return re >>> 0;
0000 0000 0000 0000 0000 0000 0000 0001
1000 0000 0000 0000 0000 0000 0000 0000
1111 1111 1111 1111 1111 1111 1001 1111
如果您拿出二进制计算器,输入这个数字并将其转换为十进制,您将看到它的值2147483648
。因为最左边的位是1
,所以它是一个负数。因为Javascript只有通用var
变量,所以它假定您需要有符号的结果。J中的>
运算符avaScript被称为一个零填充右移
,并将其与0
(>>0
)的操作数一起使用,告诉Javascript您想要一个未签名的结果
如果你很好奇(或者这篇文章的其他读者很好奇),下面是基于二进制的计算机是如何处理负数的。假设你想存储值-96
。计算机如何存储这个值?首先,忽略符号。96
在二进制中看起来是这样的:
return re >>> 0;
0000 0000 0000 0000 0000 0000 0000 0001
1000 0000 0000 0000 0000 0000 0000 0000
1111 1111 1111 1111 1111 1111 1001 1111
接下来,计算机执行2的补充。这是通过首先反转每个位来完成的(1变为0,0变为1):
最后,您只需添加1,如下所示:
return re >>> 0;
0000 0000 0000 0000 0000 0000 0000 0001
1000 0000 0000 0000 0000 0000 0000 0000
1111 1111 1111 1111 1111 1111 1001 1111
在内部,这是它存储在计算机内存中的方式。这相当于
4294967200
或-96
尝试将您的行更改为:re=((re>>0;
。如果这解决了您的问题,我将写一个答案解释原因:“所有按位运算符的操作数都转换为2的补码格式的有符号32位整数。”和“数字-2147483648(十六进制表示:-0x8000000)是除第一位(最左侧)外完全由0位组成的整数“@Icemanind是的,它很有效,而且看起来很快。为什么要换0档?@codecoder-见下面我的答案!