黑马程序员技术交流社区

标题: java中a=a^b [打印本页]

作者: danielzyj    时间: 2014-3-26 14:39
标题: java中a=a^b
本帖最后由 danielzyj 于 2014-3-27 16:31 编辑

a=a^b;
b=a^b;
a=a^b;   替换a b 的值的时候,不借助过度变量,这是个什么原理呀?
作者: Zero霖    时间: 2014-3-26 14:50
本帖最后由 Zero霖 于 2014-3-26 14:52 编辑

a=a^b;b=a^b;a=a^b;我换个方式,也就是
a=a^b;→c1=a^b;
b=a^b;→c2=c1^b=(a^b)^b=a;此时,b被赋予a的值。
a=a^b;→c3=c1^c2=(a^b)^a=b;此时,a被赋予b的值。不知道这样的解释可不可以?

作者: 蓝枫    时间: 2014-3-26 15:06
  1. n =  n^m;
  2. m =  n^m; ----(n^m)^m
  3. n =  n^m;----n^(n^m)
  4. 一个数异或同一个数两次,结果还是那个数。
  5. 利用的就是这个原理。
复制代码

作者: danielzyj    时间: 2014-3-26 15:10
蓝枫 发表于 2014-3-26 15:06

:handshake
作者: 耳东君    时间: 2014-3-26 16:17
^是位异或逻辑预算。
比如a = 1, b = 2;
a = a^b; → a =1^2; → a =0001^0010(这里把十进制的1和2换成二进制);→ a = 0011(0001和0010对应位相同时为假(即0),不同时为真(即1)) = (此时换算成十进制)3 ;
根据以上方法:
b = a^b; → b = 3^2; → b = 0011^0010 = 0001=1;
a = a^b; → a = 3^1; → a = 0011^0001 = 0010 =2;
现在就是a = 2,b = 1;了


作者: 李东梁    时间: 2014-3-26 17:13
  1. a=a^b;
  2. b=a^b;
  3. a=a^b;
复制代码

异或操作,记住一句话,一个数异或另一个数两次,结果还是这个数本身

把a,b换成具体的数字容易理解一些
作者: MVP    时间: 2014-3-26 17:38
这个知识点,你只要记住毕老师的一句话,就是“一个数被异或两次就等于原来的值”。a=a^b;
b=a^b=(a^b^b),a被异或两次,所以还是a,相当于:b=a,所以a的值就赋给b了。
a=a^b=(a^a^b,b被异或两次,所以还是b,相当于:a=b,所以b的值就赋给a了。
作者: 橸瑩膤漃寞林    时间: 2014-3-27 14:39
一个数异或同一个数两次结果还是那个数。a=a^b;把这里代入下面的式子。
b=a^b;----->b=a^b^b----->b=a
所以得到a=a^b;   

作者: 心?=忐§忑]    时间: 2014-3-27 15:21
这只是两个变量的逻辑位操作。
作者: 杨殿生    时间: 2014-3-27 18:07
异或 a^a^b=a
作者: 李庆忠    时间: 2014-3-27 21:39
本帖最后由 李庆忠 于 2014-3-27 21:41 编辑

有个知识点你得知道,就是任何一个数异或另一个数两次,结果为这个数本身,比如11^5^5=11(这个你可以在DOS中编译一下试试),下面就好办了,第一步,a=a^b后,a的值就改变了,变成了a^b,第二步,b=a^b,这里面的a已经不是初始那个a了,而是a^b,所以,b=a^b=(a^b)^b=a,这样就把a的值赋给了b;第三步,a=a^b,由于在第二步b的值也已经改变,故这一步其实是a=a^b=(a^b)^a=b
作者: 海世山盟    时间: 2014-3-27 23:41
这是异或的特点。是按位运算的。异或:当两个数相同位数上不相等时(二进制就是不同时为0,或者1),该位异或的结果就是1
a=a^b;
b=a^b;// 等同于b=(a^b)^b  运算符相同,没有运算顺序吧。也就等同于 b=a^b^b;也就等同于b=a^(b^b);所以b=a
a=a^b; //分析方法同上。
希望能够帮助你理解。
作者: 路西法    时间: 2014-3-27 23:48
总结来讲就是一个数亦或同一个数两次结果还是那个数

这道题老毕视频里有讲解

要想了解清楚  随便取两个数  用2进制在草稿上画画就明白了





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