JavaScript的Bit-wise操作如何处理NOT(~)操作?
How does JavaScript's Bit-wise operation deals with NOT (~) operation?
在JavaScript中执行以下代码行总是会产生意想不到的结果,我对此一无所知。
这就是我执行 NOT(反转)操作的方式:
2 = 0010
(~ 2) = 1101
,也就是十进制的13
。但是在 JavaScript 中执行完全相同的操作会输出值 -3
。谁能解释为什么会这样?
<body>
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML = ~ 2;
</script>
</body>
结果: -3
它是一个一元运算符,它取右边的表达式对其执行这个小算法(其中 N 是波浪号右边的表达式):-(N+1)
例如 ~2 产生 -3
JavaScript 使用 two's complement 表示整数值。它还对带符号的 32 位整数执行所有按位运算(根据需要转换参数)。所以表达式 ~2
不会导致 1101
;相反它是
1111 1111 1111 1111 1111 1111 1111 1101
恰好是-3的补码表示。 (最左边的位为1表示负数。)
请参阅 the docs on bitwise operators 了解更多信息。
P.S。如果你真的想要 13 的结果,你可以屏蔽除低四位以外的所有位:((~2) & 0xF)
.
在JavaScript中执行以下代码行总是会产生意想不到的结果,我对此一无所知。 这就是我执行 NOT(反转)操作的方式:
2 = 0010
(~ 2) = 1101
,也就是十进制的13
。但是在 JavaScript 中执行完全相同的操作会输出值 -3
。谁能解释为什么会这样?
<body>
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML = ~ 2;
</script>
</body>
结果: -3
它是一个一元运算符,它取右边的表达式对其执行这个小算法(其中 N 是波浪号右边的表达式):-(N+1)
例如 ~2 产生 -3
JavaScript 使用 two's complement 表示整数值。它还对带符号的 32 位整数执行所有按位运算(根据需要转换参数)。所以表达式 ~2
不会导致 1101
;相反它是
1111 1111 1111 1111 1111 1111 1111 1101
恰好是-3的补码表示。 (最左边的位为1表示负数。)
请参阅 the docs on bitwise operators 了解更多信息。
P.S。如果你真的想要 13 的结果,你可以屏蔽除低四位以外的所有位:((~2) & 0xF)
.