使用按位运算符更改符号

Aha*_*med 1 int performance bit-manipulation

如何使用按位运算符更改int的符号?显然我们可以使用x*=-1x/=-1.有没有最快的方法呢?

我做了一个小测试,如下所示.只是为了好奇......

public class ChangeSign {
    public static void main(String[] args) {
        int x = 198347;
        int LOOP = 1000000;
        int y;
        long start = System.nanoTime();
        for (int i = 0; i < LOOP; i++) {
            y = (~x) + 1;
        }
        long mid1 = System.nanoTime();
        for (int i = 0; i < LOOP; i++) {
            y = -x;
        }
        long mid2 = System.nanoTime();
        for (int i = 0; i < LOOP; i++) {
            y = x * -1;
        }
        long mid3 = System.nanoTime();
        for (int i = 0; i < LOOP; i++) {
            y = x / -1;
        }
        long end = System.nanoTime();
        System.out.println(mid1 - start);
        System.out.println(mid2 - mid1);
        System.out.println(mid3 - mid2);
        System.out.println(end - mid3);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出几乎类似于:

2200211
835772
1255797
4651923
Run Code Online (Sandbox Code Playgroud)

Han*_*s Z 13

几乎所有机器上非浮点(例如int math)加法/乘法和按位运算之间的速度差异都小于可忽略不计.

没有通用的方法只使用按位运算将n位有符号整数转换为负等效,因为否定操作看起来像x = (~x) + 1需要一次加法.但是,假设有符号整数是32位,您可以编写一个按位方程式来进行此计算.注意:不要这样做.

否定数字的最常见,可读的方法是x = -x.


SJu*_*n76 8

Java使用Complement Two表示.为了改变符号,这意味着你必须做一个按位否定(它相当于xor和FFFF)并加1.

x = ~x + 1;
Run Code Online (Sandbox Code Playgroud)

我几乎可以肯定-x,如果有的话,比那更快.