近日,看见微信群里讨论交换两个数字时,又有人提出异或运算效率很高的命题。因此,我又用 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 语言编译并反编译生成汇编指令后,根据汇编指令的行数得出的结论。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于