黑马程序员技术交流社区

标题: 关于异或 [打印本页]

作者: 王勇文    时间: 2013-1-21 13:49
标题: 关于异或
本帖最后由 张向辉 于 2013-1-22 12:41 编辑

       对两个变量的数据进行互换,不使用第三方变量。


         int a=3, b=5;     互换成——》 int a=5,b=3;


              并麻烦给我解释一下 异或的原理。     和这题的怎么弄成的。
作者: 张世钦    时间: 2013-1-21 14:01
本帖最后由 zhangshisk 于 2013-1-21 14:13 编辑

^:异或
true ^ true = false
true ^ false = true
false ^ true = true
false ^ false = false
两边相同,结果是false
两边不同,结果是true

例如 60^6用二进制表示(只写8位)
0011-1100
^0000-0110
=0011-1010
如果结果再^6的话
0011-1010
^0000-0110
=0011-1100
结果就是60  
这个就是原理:一个数异或同一数2次,结果还是这个数.也就是a^b^b的结果是a,

这题要是互换的话应该这么写:
a = a^b;
b = a^b;//在这里可以拆分为:b = a^b^b;这时也就是说把a的值赋给了b,
a = a^b;//在这里可以拆分为:a = a^b^a^b^b=(a^b^b)^a^b=b^a^a,

这种方法可以防止溢出,因为没有进行算术运算,只是逻辑运算.
用第三方变量互换的话如果值过大容易超出类型范围,
作者: 黑马张英涛    时间: 2013-1-21 14:09
老毕的视频里有这个啊。。。
  1. public class NewTest {       
  2.         public static void main(String[] args) {               
  3.                 int a=3,b=5;
  4.                 a=a^b;
  5.                 b=a^b;
  6.                 a=b^a;
  7.                 System.out.println(a+"..."+b);
  8.         }       
  9. }
复制代码

作者: 陈丽莉    时间: 2013-1-21 14:10
异或的概念是相同则为假,不同则为真。也就是说0^1=1; 1^1=0;这样
两个数做异或运算的时候,也就是二进制数挨个位做异或运算,如3^5:

也就是说,一个数a与另一个数b异或两次,结果仍为a本身。
作者: 孙辉辉    时间: 2013-1-21 14:13
例如
a = x
b =y
a= a^b = x^y
b = a^b = (x^y)^y =x
a=a^b = (x^y)^x = y
现在a= y b  = x  是实现了交换了吧
作者: 黑马刘杰    时间: 2013-1-21 14:17
本帖最后由 黑马刘杰 于 2013-1-21 14:18 编辑

a=a^b;
b=a^b;
a=a^b;
a和b就交换了。这样子并没有提高效率,只是智力上的消遣罢了。

异或,顾名思义就是对应的二进制位相异才为真。比如:
a=1010,b=1101,a与b异或就是0111。

任何数与0异或还是他本身,任何数与1异或就是取反,任何数与自己异或就是0.




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