黑马程序员技术交流社区
标题:
关于异或
[打印本页]
作者:
王勇文
时间:
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
老毕的视频里有这个啊。。。
public class NewTest {
public static void main(String[] args) {
int a=3,b=5;
a=a^b;
b=a^b;
a=b^a;
System.out.println(a+"..."+b);
}
}
复制代码
作者:
陈丽莉
时间:
2013-1-21 14:10
异或的概念是相同则为假,不同则为真。也就是说0^1=1; 1^1=0;这样
两个数做异或运算的时候,也就是二进制数挨个位做异或运算,如3^5:
000.png
(3.43 KB, 下载次数: 76)
下载附件
2013-1-21 14:07 上传
也就是说,一个数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