java异或运算交换两个数的陷阱
2015-08-12 20:43
597 查看
我们知道,用异或运算可以不用定义中间变量就可以交换两个数。如下:
<span style="font-size:14px;">int a=2;int b=3;System.out.println("交换前:a="+a+" b="+b);a=a^b;b=a^b;a=a^b;System.out.println("交换后:a="+a+" b="+b);</span>输出的结果是:交换前:a=2 b=3交换后:a=3 b=2这样看来,使用异或运算法则交换两个数的方法确实很好用。但是我们在某些特殊的地方使用它就要小心了,比如我们在选择排序算法中使用它时:
<span id="_xhe_cursor"></span><span style="font-size:12px;">package com.test;public class Test {public static void main(String[] args) {int a[] = { 5, 3, 7, 9, 0, 2, 1, 4, 6, 8 };Select select = new Select();select.sort(a);// 遍历输出排好的数组for (int i : a) {System.out.print(i + " ");}}}// 选择排序类class Select {public void sort(int a[]) {for (int j = 0; j < a.length - 1; j++) {int min = a[j];// 最小的值int minLndex = j;// 最小值的下标for (int k = j + 1; k < a.length; k++) {if (min > a[k]) {min = a[k];minLndex = k;}}// 使用异或运算交换两个数a[j] = a[j] ^ a[minLndex];a[minLndex] = a[j] ^ a[minLndex];a[j] = a[j] ^ a[minLndex];}}}</span>输出的结果是:0 1 2 3 4 5 6 0 8 9为什么呢?其实我们知道,异或运算a^a=0,我们仔细分析一下可以发现在选择排序算法中就有a^a的情况,所以出现上面这样的结果也就不奇怪啦。对于以上bug,我们可以这样解决:在交换之前先判断
<pre class="java" name="code">if(a[j]!=a[minLndex]){a[j]=a[j]^a[minLndex];a[minLndex]=a[j]^a[minLndex];a[j]=a[j]^a[minLndex];}这样,输出的结果就是正确的了。总结:以后用到异或运算交换两个数时,首先要想到所有数中有没有自身跟自身交换的情况
相关文章推荐
- [leetcode-130]Surrounded Regions(java)
- Java从键盘输入值
- Java ImageIcon 不能显示问题
- org.springframework.http.converter.HttpMessageNotWritableException:
- org.springframework.http.converter.HttpMessageNotWritableException:
- org.springframework.http.converter.HttpMessageNotWritableException:
- 浅析构造方法
- Spring声明式事务
- springMVC文件上传
- java连接MySQL数据库
- 第 2 页:Spring的设计理念
- 第 1 页:Spring的骨骼架构
- 如何手动生成heapdump和javacore文件
- Java心得12
- eclipse里配置maven
- MyEclipse2014安装svn插件的方式:
- java基础------数组
- Ant自定义任务开发
- 关于windows系统下eclipse开发NDK,是否还需要cygwin的问题
- JAVA多线程编程