黑马程序员技术交流社区

标题: 简单基础题,有点迷惑 求指教。 [打印本页]

作者: 杨华东    时间: 2012-10-7 20:03
标题: 简单基础题,有点迷惑 求指教。
本帖最后由 杨华东 于 2012-10-7 20:05 编辑
  1. public class Test6 {
  2. /*交换同类型数据的最高效率方式如下。
  3. ** */
  4. public static void main(String[] args) {
  5. int a = 0;
  6. int b = 8;
  7. a=a^b; //谁能给我说的透彻,给你申请技术分啊。
  8. b=a^b;
  9. a=a^b;
  10. System.out.println(a+" "+b);
  11. }
  12. }
复制代码

作者: 李兆宁    时间: 2012-10-7 20:13
a^b^b = a

这个你懂吗?
作者: 黑马连家华    时间: 2012-10-7 20:15
首先这确实是最有效率的方式
因这使用的是位运算
^总结出来的特性是 一个数被另一个数异或两次,它的结果还是它本身( 我们可以利用这个 来写一个低级加密程序哦)
例如
3^2的结果为 1            (二进制 :11^10==1)
1再异或2结果为3         (二进制 :1^10 == 11)
也就是说
a^b^b==a
剩下的就不用解释了吧- -+
加分!

作者: 李兆宁    时间: 2012-10-7 20:18
a=a^b; //1式
b=a^b;//把a用上式右边代替,即是:b=a^b^b  ,就是把最初的a赋给b
a=a^b;//把1式右边代替a,,b已经是最初的a值了,,,所以等价于用最初的值表示: a=a^b^a,  就是b值
作者: 胡高德    时间: 2012-10-7 20:18
public class Test6 {

/*交换同类型数据的最高效率方式如下。

** */

public static void main(String[] args) {

int a = 0;

int b = 8;

a=a^b; //将a的值与b的值调换另一种方法就是利用逻辑运算符:^。规律:一个数亦或另一个数两次,结果还为那个数。注意:如果两个数非常大可能会超出int范围。

b=a^b;//b=(a^b)^b

a=a^b;//a=a^(a^b)

System.out.println(a+" "+b);

}

}

作者: 黑马连家华    时间: 2012-10-7 20:31
胡高德 发表于 2012-10-7 20:18
public class Test6 {

/*交换同类型数据的最高效率方式如下。

那个 不好意思 ,关于两个非常大的数异或是不会会超出int的范围的.
因为a和b都是int值,只要这两个值都是相同类型,那就不会超出范围
例如 a和b值都是int值的上限,那他们两个异或的值为0,再次异或a或者b它的值还是int的上限,永远不会超出
你说的那个是普通的算术运算符的交换吧?搞混了
作者: 打工人    时间: 2012-10-7 20:34
同意楼上
作者: 花裤头    时间: 2012-10-7 20:59
相同输出0,不同输出1,例如:
System.out.println(1^1); 输出0
System.out.println(1^2);输出3,因为最后2个低位都不一样,所有输出3 。
比如2^1=3,二进制就是:0010^0001=0011
如果两个数值异或后的值相同,异或前可能不同。  
例如0^3=3,二进制就是:0000^0011=0011。
作者: 花裤头    时间: 2012-10-7 21:07
补充下:
a=a^b;  
b=a^b;  //b = (a^b)^b =a
a=a^b; // a = a^(a^b) = b

懂否?
作者: 杨华东    时间: 2012-10-7 21:20
问题已解决




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2