近日,看见微信群里讨论交换两个数字时,又有人提出异或运算效率很高的命题。因此,我又用 Java 语言测试了一下效率。在此,我希望大家事实说话,不要听信各种谣传的结论。
/**
* @author JiangQiang
* @date 2019/12/28 13:21
*/
public class Test {
public static void main(String[] args) {
int a = 1234;
int b = 2345;
int c;
int total = 10000000;
long time1 = System.currentTimeMillis();
for (int i = 0; i < total; i++) {
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
long time2 = System.currentTimeMillis();
for (int i = 0; i < total; i++) {
c = a;
a = b;
b = c;
}
long time3 = System.currentTimeMillis();
for (int i = 0; i < total; i++) {
a = a+b;
b = a-b;
a = a-b;
}
long time4 = System.currentTimeMillis();
for (int i = 0; i < total; i++) {
a = a*b;
b = a/b;
a = a/b;
}
long time5 = System.currentTimeMillis();
System.out.println(time2 - time1);
System.out.println(time3 - time2);
System.out.println(time4 - time3);
System.out.println(time5 - time4);
}
}
输出结果:
18
3
3
280
之前我用 C 语言和 C++ 也测试过,异或运算的效率都比最常用的交换算法低很多。至于什么原因,因为很多人都以为异或运算效率很高,所以网上讨论为什么效率低的文章就比较少,之前看见一文章中的探讨过程稍微有点说服力,是把 C 语言编译并反编译生成汇编指令后,根据汇编指令的行数得出的结论。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于