不用临时变量交换两个数

今天在看王老师的Java项目题时,发现有个答案在进行二分法排序的时候,在交换变量这块,并没声明申请中间变量,而是直接进行异或交换,由于第一次遇到这样的情况,感觉非常新鲜,好奇之下探究了下,首先看看它的具体方法是什么样子的:

Code:
  1. public static void sort(int[] a) {  
  2.             for (int i = 0; i < a.length - 1; i++) {  
  3.                 boolean noswap = true;  
  4.                 for (int j = 0; j < a.length-i-1; j++) {  
  5.                     if (a[j] > a[j+1]) {  
  6.                         //int temp = 0;  
  7.                         /*temp = a[j]; 
  8.                         a[j] = a[j + 1]; 
  9.                         a[j + 1] = temp;*/  
  10.                         a[j]^=a[j+1];  
  11.                         a[j+1]^=a[j];  
  12.                         a[j]^=a[j+1];//异或交换  
  13.   
  14.                         noswap = false;  
  15.                     }  
  16.                 }  
  17.                 if (noswap)  
  18.                     break;  
  19.             }  
  20.         }  

这里其实就是用到了异或计算方法,相同为0,不同为1,且若c=a^b,则a^c == b, b^c == a,不过在网上看了某人的评价,说这样做在时间性能上不好,建议不要用,只为应对面试题而已……

分析:

前两个赋值语句:“a = a ^ b;”和“b = b ^ a;”相当于b = b ^ (a ^ b),而b ^ a ^ b等于a ^ b ^ b。b ^ b的结果为0,因为同一个数与相向相^,结果必为0。因此b的值等于a ^ 0,即a。

再执行第三个赋值语句:“a = a ^ b”。由于a的值等于(a ^ b),b的值等于(b ^ a ^ b),因此,相当于a = a ^ b ^ b ^ a ^ b,即a的值等于a ^ a ^ b ^ b ^ b,等于b。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值