按位运算正数转负数

Bitwise operation positive number to negative

抛开性能和优化的争论。

我正在 Javascript 中寻找一种方法,将数字设为 5,然后使用按位运算将其更改为 -5。

翻转位的问题是 0 变成 1 ergo ~5 变成 -6。

有没有办法完全通过位操作来做到这一点?我觉得重新添加 1 会抵消我可能会或可能不会获得的微小改进。

并没有快多少。它没有任何意义。当你需要否定数字时,没有人能比你的 CPU 做得更好。 http://jsperf.com/minus-vs-not

作为整数的负数是two's complement。要使用二进制补码翻转符号,您可以这样做:

"To get the two's complement of a binary number, the bits are inverted, or "flipped", by using the bitwise NOT operation; the value of 1 is then added to the resulting value, ignoring the overflow which occurs when taking the two's complement of 0."

在 JavaScript 中是:

n = ~n + 1;

如果您正在寻找性能,那可能不是最快的方法。这很可能是使用专门为此设计的运算符:

n = -n;

如果有人想知道如何在不使用 + 或 - 符号的情况下在负数和正数 (n) 之间来回移动...

n = ~n
add = 1
while add: 
     diff = add^n
     carry = (add&n)<<1
     add = carry
     n = diff
print(n)