Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 反向位:为什么';它给了我一个负值? var reverseBits=函数(n){ var-re=0; 对于(变量i=0;i>=1; } 返回re; };_Javascript_Bit Manipulation_Bitwise Operators - Fatal编程技术网

Javascript 反向位:为什么';它给了我一个负值? var reverseBits=函数(n){ var-re=0; 对于(变量i=0;i>=1; } 返回re; };

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

这是我在Javascript中反转位的代码,但当n=1时,它给出-2147483648(-100000000000000000000000),它不应该是正数吗?我哪里错了

不应该是正数吗?我错在哪里

不,不应该。除
>
之外的所有位运算符都使用有符号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-见下面我的答案!