Aha*_*med 1 int performance bit-manipulation
如何使用按位运算符更改int的符号?显然我们可以使用x*=-1或x/=-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.
Java使用Complement Two表示.为了改变符号,这意味着你必须做一个按位否定(它相当于xor和FFFF)并加1.
x = ~x + 1;
Run Code Online (Sandbox Code Playgroud)
我几乎可以肯定-x,如果有的话,比那更快.