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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© air 中级黑马   /  2013-9-29 00:36  /  1893 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

视频里的题目是这样的:
  对两个整数变量的值进行互换(不使用第三方变量),里面讲到的第三种方法是
int n=3,m=8;
n = n ^ m;
m = n ^ m;  //(n^m)^m
n = n ^ m;   //n^(n^m)

我的问题是: 有了注释看明白了后,可是叫我摸透 不用注释,还是比较麻烦,理解起来太空洞,太模糊了。
有童鞋给个清晰的举例和应用吗?

万分感谢

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

9 个回复

正序浏览
一个数同事异或这个数两次还是这个数,慢慢推敲并不难.我来举个例子你就明白了public class Test2 {          public static void main(String[] args) {                         int a=10;                         int b=20;                         //一个数同时异或这个数两次还是这个数                          a=a^b;                                                   b=a^b;//相当于a^b^b===>b=a;                          //a此时变成了20              a=a^b;//这个值的变化来自第一步相当于(a=a(10)^b(20))^b(20)                     System.err.println(a+"::"+b);         }  }希望对你有帮助如果实在不明白QQ:2855184480

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
你将其中的字符进行改变就行,进行代理
n 1= n ^ m;
m 1= n1 ^ m=n^m^m
n = n 1^ m1;=(n^m)^(n^m^m)
这个是用数学的角度解的,能看懂不?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
你可以这样理解就好比三个数:
            int num1 = 5;
            int num2 = 6;

            num1 = num1 + num2;//num1和num2的和
            num2 = num1 - num2;//num1-num2的值就是num1的值,然后赋给num2
            num1 -= num2;//num1-num2(现在是num1的值)就是num2的值,然后赋给num1
道理都是一样的

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
很简单啊,就一个定理搞定:一个数与另一个数连续异或两次,得到这个数本身。
要会运用这句话哦。
用符号表示就是:a^b^b=a
我们再来看下面的式子:
a=a^b;//赋值
b=b^a;//赋值   b=b^a=b^(a^b)=b^a^b=a
a=a^b;//赋值   a=a^b=(a^b)^a=a^b^a=b


你明白了吗?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
/*
关于这个问题,
我是这样理解的:
*/

int m=3,n=8;
m=m^n//将m与n^后的值存储在m所开辟的int空间
n=m^n//这时相当于n=m^n^n-->n=m;
m=m^n//根据上面的运行结果相当于:m=m^m^n-->m=n;
//这样,m与n的值就互换了

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
温馨提示:若问题得到解决,请重新编辑帖子,修改主题分类为“提问结束”。
回复 使用道具 举报
int n=3,m=8;
n = n ^ m;
m = n ^ m;  //m=(n^m)^m=>n^m^m=>(因为m^m是相同的那么就0,根据亦或的规则)=>n^0(因为不同,那就n)
n = n ^ m;   //=>n^(n^m)=>n^n^m=>0^m=>m(道理是同样的)这样理解应该会好一点

评分

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

查看全部评分

回复 使用道具 举报
最常见的应用的话我想应该是排序吧,比如给你一个数组,让你按照从小到大或者从大到小的顺序排序,比如下面用冒泡法排序:
int[] num=new int[]{4,7,15,1,6,9,3,40,2};
int tem=0;
  //普通方式:
for (int i=num.length-1; i>0; i--){
for(int j=0; j<i; j++){
if (num[j+1]<num[j]){
tem=num[j+1];
num[j+1]=num[j];
num[j]=tem;
}
}
}
  //如果我们使用异或运算实现就是:
for (int i=num.length-1; i>0; i--){
for(int j=0; j<i; j++){
if (num[j+1]<num[j]){
num[j+1] = num[j+1] ^ num[j];
num[j] = num[j+1] ^ num[j];
num[j+1] = num[j+1] ^ num[j];
}
}
}
两个方法的结果是一样的。第二个方法抽象出最简单的模式的话就是你的题目中所展示的一样,原理是这样的:
int n=3,m=8;
n = n ^ m;
m = n ^ m; //(n^m)^m
n = n ^ m; //n^(n^m)
3对应的二进制数为0000 0011,8对应的二进制数为0000 1000,二者取异或结果为0000 1011,对应的十进制为11,将其赋给n,然后0000 1011与0000 0011取异或的结果为0000 1000,即8,赋给m,最后0000 1011与0000 1000取异或的结果为0000 0011,即3赋给n。这样就将两个数组进行了替换,你可以试着将这个替换过程想象成两个人玩牌的游戏,每个人有8张牌(这里的牌只有状态没有大小之分),彼此对应,两个人都想获得对方的牌的状态信息。每张牌有显示(0)和掩饰(1)两个状态,其中一个人根据另一个人的牌的状态调整自己对应牌的状态,当两个人对应的牌都显示或都掩饰时,其中一个人将自己的这个牌设为显示,而如果对应牌状态不同,就奖牌设为掩饰。第一个人奖牌调整之后,第二个人再根据第一个人现在牌的状态进行相同的调整,然后第一个人根据第二个人的现在牌的状态进行调整,很容易就会看到第一个人会得到第二个人牌的初始状态,第二个人得到了第一个人的初始状态。
可能最后的类比不是最恰当的,不过还是挺有趣的。不知道有没有回答您的问题。

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1 很给力!

查看全部评分

回复 使用道具 举报
不要深究。这个格式很好记的。
你把他背下来。等以后用多了你就理解了。
同是新手{:soso_e181:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马