javascript - 为什么按位 "not 1"等于 -2?

标签 javascript numbers bitwise-operators

假设我们有 1 并且这个以 2 为基数的数字是:

00000000000000000000000000000001

现在我想翻转所有位以获得以下结果:

11111111111111111111111111111110

据我所知,解决方案是使用~(按位非运算符)翻转所有位,但是~1的结果是 -2:

console.log(~1); //-2
console.log((~1).toString(2)); //-10 (binary representation)

为什么我会得到这个奇怪的结果?

最佳答案

1-2之间有2个整数:0-1

1   二进制为 00000000000000000000000000000001
0   二进制为 00000000000000000000000000000000
-1 二进制为 11111111111111111111111111111111
-2 二进制为 11111111111111111111111111111110
(“二进制” 是 2 的补码,在按位非 ~ 的情况下)

如您所见,~1 等于 -2 并不奇怪,因为 ~0 等于 -1.

@Derek explained ,这些bitwise operators将它们的操作数视为 32 位序列。另一方面,parseInt 则不然。这就是为什么您会得到一些不同的结果。

<小时/>

这是一个更完整的演示:

for (var i = 5; i >= -5; i--) {
  console.log('Decimal: ' + pad(i, 3, ' ') + '  |  Binary: ' + bin(i));
  if (i === 0)
    console.log('Decimal:  -0  |  Binary: ' + bin(-0)); // There is no `-0`
}

function pad(num, length, char) {
  var out = num.toString();
  while (out.length < length)
    out = char + out;
  return out
}

function bin(bin) {
  return pad((bin >>> 0).toString(2), 32, '0');
}
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 为什么按位 "not 1"等于 -2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31377474/

相关文章:

c - 如何从文件中读取数字字符串并将它们放入数组中?

php - 不同机器上的按位运算结果不同

javascript - PHP Inside JavaScript - 引号问题?

javascript - 当我们确定对象已创建时如何获取对象的属性

javascript - 使用 QUnit 测试在 async() 断言中断言测试失败

javascript - 如何将带有适当逗号的数字四舍五入到小数点后两位?

javascript - 如何不将类添加到特定 block ?

查找大数字范围内有多少个子字符串的算法

c - Ansi C 中的位设置和位移位

php - 按位运算符 XOR ('^' ) 如何工作?