A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王勇文 中级黑马   /  2013-1-21 13:49  /  1626 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-22 12:41 编辑

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


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


              并麻烦给我解释一下 异或的原理。     和这题的怎么弄成的。

评分

参与人数 1黑马币 +6 收起 理由
Rancho_Gump + 6 赞一个!

查看全部评分

5 个回复

倒序浏览
本帖最后由 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,

这种方法可以防止溢出,因为没有进行算术运算,只是逻辑运算.
用第三方变量互换的话如果值过大容易超出类型范围,

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
老毕的视频里有这个啊。。。
  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. }
复制代码
回复 使用道具 举报
异或的概念是相同则为假,不同则为真。也就是说0^1=1; 1^1=0;这样
两个数做异或运算的时候,也就是二进制数挨个位做异或运算,如3^5:

也就是说,一个数a与另一个数b异或两次,结果仍为a本身。

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
例如
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:19

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 黑马刘杰 于 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.

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马