按位运算正数转负数
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)
抛开性能和优化的争论。
我正在 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)