黑马程序员技术交流社区
标题:
将2个数字置换,要求不使用第三方变量,怎么做?
[打印本页]
作者:
wawsc5354524
时间:
2014-8-10 01:43
标题:
将2个数字置换,要求不使用第三方变量,怎么做?
老师说是使用什么异或3次就可以了,谁可以给我讲讲什么异或3次就置换了,有点想不明白~
作者:
wawsc5354524
时间:
2014-8-10 01:45
第一种我知道是咋整,定义一个第三方的变量交换即可。关键是这第二种,不准使用第三方变量的哈
作者:
孤守星空
时间:
2014-8-10 07:50
我来拿经验
^是同为假,不同为真
即 a=a^b;
b=a^b; //a^b^b=a
a=a^b; //a^b^a=b
作者:
冷风
时间:
2014-8-10 08:26
这样看你是否清楚点。
a=a^b;
b=a^b;//(a^b)^b=a
a=a^b;//(a^b)^(a^b)^b=b
//一个数异或上另一个数两次就等于这个数
作者:
bfl625
时间:
2014-8-10 09:50
异或三次,自己画画图,理解下啊,
作者:
柀堓椛開
时间:
2014-8-10 09:56
用异或 来实现
a=a^b;
b=a^b;
a=a^b;
作者:
wyf20106
时间:
2014-8-10 10:00
来学习拉
作者:
舍我其谁
时间:
2014-8-10 10:02
跟楼主有同样的问题
作者:
a6511631
时间:
2014-8-10 10:07
public static void main(String[] args){
int a = 5 ;
int b = 4 ;
a=a-(b=a-b);
b=b+a;
System.out.println(a+" "+b);
}
复制代码
作者:
想做开发
时间:
2014-8-10 10:09
昂 看一下
作者:
想做开发
时间:
2014-8-10 10:18
昂 看一下
作者:
sunshine9091
时间:
2014-8-10 10:24
基础视频里不是有嘛,楼主得努力啊!
作者:
Ezreal
时间:
2014-8-10 10:27
学习学习
作者:
wawsc5354524
时间:
2014-8-10 14:46
public static void main(String[] args){
int a = 5 ;
int b = 4 ;
a=a-(b=a-b);
b=b+a;
System.out.println(a+" "+b);
}
复制代码
作者:
cs8630323
时间:
2014-8-10 15:33
a=a-b
b=b+a
a=b-a
一样道理,这个好理解吧
作者:
玥夜
时间:
2014-8-10 16:54
视频里都有哎 你是来水经验的麽
作者:
如果有梦
时间:
2014-8-10 17:31
public class Test1 {
public static void main(String[] args) {
int a= 3;
int b =4;
System.out.println("a = "+a + " b = "+b);
a = a+b;
b = a-b;
a = a-b;
System.out.println("a = "+a + " b = "+b);
}
}
复制代码
作者:
jw在路途
时间:
2014-8-10 19:05
我也来看看~~
推荐4种方案,你任选一种理解:
方式1// 设置一个第三方变量 x 你老师不允许用,那我就不推荐了
作者:
jw在路途
时间:
2014-8-10 19:14
方式2//
a=a^b; //这里吧a^b的值 复制给了 a,
b=a^b; //a^b=a^b^b=a; 解释下:( 因为根据异或2次同一个数等于它本身的原理)这里的a指(a^b),
a=a^b; //a^b=a^b^a=b; 解释:看上一步骤,这里的b已经被上面的a赋值了,所以a^b 也就可以理解为 a^a,参照第一步,a之前被 a^b赋值。 所以结果就是 a^ (a^b) ==b; 这样通过异或就完成了不用第三方转换
根据原理(一个数异或2次同一个数等于它本身); 你看看,希望你能快速理解
作者:
jw在路途
时间:
2014-8-10 19:17
方式3//
给一个
int a=10;
int b=20;
a=a+b; //a=30
b=a-b; // b=10
a=a-b; // a=30-10=20;
通过a,b加减运算,不需要第三方变量 可完成转换
作者:
继续悲伤
时间:
2014-8-10 19:20
a=a^b;
b=a^b;
a=a^b;
因为同一个数被亦或两次得到的还是原来的那个数!
作者:
jw在路途
时间:
2014-8-10 19:21
方式4//
同样给两个变量
int a=10;
int b=20;
a=(a+b)-(b=a); //只需要一步 即可转换a,b 的值
分析:
(b=a),指把 a赋值给b,首先一步转换
(a+b),值两数的和,
(a+b)-(b=a),指两数之和 减去 a (这里的a 是因为上面 b被a 赋值了) , 结果就是b
转换成功~~~
作者:
月夜小楠
时间:
2014-8-10 20:07
路过。。。
作者:
caiyaoren
时间:
2014-8-10 20:19
看看异或就可以
作者:
毕业生
时间:
2014-8-10 20:37
^表示异或(XOR)。当且仅当a=b时,有a^b=0 。异或满足交换律和结合律:
交换律:a ^ b = b ^ a
结合律:(a ^ b) ^ c = a ^ (b ^ c)
另外,在异或运算中,0类似加法中的0:加法中 a + 0 = a,异或中,a ^ 0 = a
好了,有上述知识准备就可以来看你的题目了:
a = a^b; // 这句没什么可说的
b = b^a;
由于前一句改变了a,因此这里变为:
b = b ^ (a ^ b)
= b ^ (b ^ a) (交换律)
= (b ^ b) ^ a (结合律)
= a (b ^ b = 0, a ^ 0 = 0)
a = a^b;
由于前两句的执行效果,这句变成:
a = (a ^ b) ^ a
= (b ^ a) ^ a (交换律)
= b ^ (a ^ a) (结合律)
= b (a ^ a = 0, b ^ 0 = b)
至此,完成a和b的交换
作者:
晋一峰
时间:
2014-8-10 20:46
一个语句实现 a=a+b-(b=a);
作者:
怀念黑海岸
时间:
2014-8-10 21:07
使用 与 逻辑运算运算
作者:
酋长第一
时间:
2014-8-10 21:26
一个数,被另一个数异或两次,还是他的本身
a=a^b;
b=a^b; 此时a^b 原来的表达式就可以表示为 b=(a^b)^b=a
a=a^b;同理 a=a^a^b=b
作者:
Justfeeling
时间:
2014-8-10 21:36
张老师的视频里有详细叙述
作者:
dingpanbo
时间:
2014-8-10 22:01
还有一个用两数和的方法
作者:
dingpanbo
时间:
2014-8-10 22:05
m=m+n; n=m-n; m=m-n;
作者:
复仇者联盟
时间:
2014-8-10 22:09
其实异或那个方法比较不错,至少它不会出错,通过加减那种方法可能会出现错误,得到的结果不一定是你想要的。
作者:
梧桐树下
时间:
2014-8-10 23:10
视频讲的很清楚
作者:
happymouse
时间:
2014-8-10 23:13
楼上答得都不错
作者:
周峰峰
时间:
2014-8-10 23:14
jw在路途 发表于 2014-8-10 19:17
方式3//
给一个
int a=10;
不错!!!!!!!!
作者:
柠萌不
时间:
2014-8-10 23:45
异或就可以解决了
作者:
黄宝宝
时间:
2014-8-10 23:47
拿个真实的数来算一算不就哦了么
作者:
M单色调
时间:
2014-8-11 00:13
这个挺有意思的,学习了!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2