黑马程序员技术交流社区

标题: 我是真心的搞不懂位运算的一道练习题 [打印本页]

作者: 289623337    时间: 2014-9-25 19:58
标题: 我是真心的搞不懂位运算的一道练习题
int n=3,m=8
//11=3+8;
//3=11-8;
//8=11-3;
n=n+m;
m=n-m;
n=n-m;

System.out.println("n="+n",m="+m);

最后达到的目是两个整数变量值互换





我是真心的搞不懂是
n=n+m;
m=n-m;
n=n-m;
这三个等式的由来,是什么规律???
作者: 18643448863    时间: 2014-9-25 20:09
这只是 置换 而已  记着就行  数学思维  不过 一般置换 追容易想到的 还是第三方变量  
作者: 289623337    时间: 2014-9-25 21:25
18643448863 发表于 2014-9-25 20:09
这只是 置换 而已  记着就行  数学思维  不过 一般置换 追容易想到的 还是第三方变量   ...

其实我就是搞不懂n m 代表的意思,要当做规律来记忆的话还可以,
作者: 杨佳名    时间: 2014-9-25 21:37
这个挺简单的
n=n+m;                    //n=n+m                                   此时m=m
m=n-m;                    //m=(n+m)-m=n                      此时n=n+m
n=n-m;                     //n=(n+m)-(n)=m
作者: 289623337    时间: 2014-9-25 21:54
本帖最后由 289623337 于 2014-9-26 06:27 编辑
杨佳名 发表于 2014-9-25 21:37
这个挺简单的
n=n+m;                    //n=n+m                                   此时m=m
m=n-m;     ...

好乱好乱有点晕了
第一行m=m没有错,那n=n也是对的?
第二行算完m=n也是对的?
第三行就是了部分代入法吗?
彻底的头疼了,简单的背公式还是可以的!麻烦你了!
作者: 杨佳名    时间: 2014-9-25 22:02
289623337 发表于 2014-9-25 21:54
好乱好乱有点晕了
第一行m=m没有错,那n=n也是对的?
第二行算完m=n也是对的?

第一行  n变成了n+m       m还是m
第二行是用第一行的数据       m变成了(n+m)-m,即m变成了n;n还是第一行的n+m
第三行是用第二行的数据。    ……()楼主自己推一下
作者: Imp_x    时间: 2014-9-25 22:03
你直接引入一个新变量  看懂了这个  往回去看你就懂了  他就节省了新建变量这一步

a = n + m;
m = a - m = n;
n = a - n = m;

作者: 不系之舟王    时间: 2014-9-25 22:05
实在搞不懂,可以再添加一个变量,用赋值来实现值的交换
作者: ζ_____________    时间: 2014-9-25 22:25
int n=3,m=8

n=n+m; //此时 n(3)就是m(8) 与 n(3) 的和 可以理解为 sum = n+m;( sum = 3 + 8 )
m=n-m;//此时  m 就是 m(8) 与 n (3) 的和(也就是sum) 减去 m(8). 结果就是 原来的 n(3),
n=n-m;//此时 n 就是 m(8) 与 n (3) 的和(也就是sum) 减去 重新赋值后的m,也就是原来的n(3),结果就是原来的m .

//完成了 m 和 n的置换,  缺点就是, 如果m 和 n 的值比较大的话, 会超出int的取值范围,导致损失精度.
System.out.println("n="+n",m="+m);






作者: 黑马的小菜鸟    时间: 2014-9-25 22:29
加油偶!


作者: 289623337    时间: 2014-9-26 06:50
本帖最后由 289623337 于 2014-9-26 07:04 编辑
ζ_____________ 发表于 2014-9-25 22:25
int n=3,m=8

n=n+m; //此时 n(3)就是m(8) 与 n(3) 的和 可以理解为 sum = n+m;( sum = 3 + 8 )

多谢上面几位马友的耐心解答,终于搞懂了,我感觉还是引用了一个变量,让mn的值互换了,这种思维就在计算机编程中有,还是属于高等数学的思维呢?
在此忍不住的必须夸夸你,你在解释的时候编码都写得这么规范,很详细的注释,编码的编写习惯很好!

作者: 289623337    时间: 2014-9-26 06:53
不系之舟王 发表于 2014-9-25 22:05
实在搞不懂,可以再添加一个变量,用赋值来实现值的交换

嗯,我感觉添加变量和第三方是有区别的,题目中有mn在添加mn是属于添加变量,要是添加别的话,就是第三方变量。是否?
作者: 289623337    时间: 2014-9-26 07:00
杨佳名 发表于 2014-9-25 22:02
第一行  n变成了n+m       m还是m
第二行是用第一行的数据       m变成了(n+m)-m,即m变成了n;n还是第 ...

多谢杨兄的耐心讲解,我有种茅塞顿开的感觉,感觉到获取知识的快乐,现在终于搞懂了!
作者: 289623337    时间: 2014-9-26 07:01
黑马的小菜鸟 发表于 2014-9-25 22:29
加油偶!

必须的,一起!!!come on,toghter!
作者: 沈木生    时间: 2014-9-26 10:31
腾讯面试曾经就有这样的题目哦
作者: 杨佳名    时间: 2014-9-26 11:57
289623337 发表于 2014-9-26 07:00
多谢杨兄的耐心讲解,我有种茅塞顿开的感觉,感觉到获取知识的快乐,现在终于搞懂了! ...

不客气。都是在路上。
作者: 不系之舟王    时间: 2014-9-26 18:06
289623337 发表于 2014-9-26 06:53
嗯,我感觉添加变量和第三方是有区别的,题目中有mn在添加mn是属于添加变量,要是添加别的话,就是第三方 ...

第三方变量,不是太懂,我只知道我一般做交换两变量值时是这样的,引入一个变量s,s=m:m=n:n=s,感觉这样更容易理解。
作者: ___瘦不了    时间: 2014-9-26 18:35
呃、、、、
n = n+m;//这一部不说了
m = n-m;//这个式子拆分开来是不是:m = (n+m)-m,也就是说m=n,对不?把n的值赋给了m
n = n - m;//l楼主一定是到这蒙圈了,此刻n是不是等于(n+m),m是不是等于n?再将此式拆分:n = (n+原来的m)- n,对不?那么n是不是等于原来的m了?显然是的。此题结束。

作者: zuochbd    时间: 2014-9-26 19:36
这个不是位运算, +和-不是位运算符.
& | ~ ^这才是位运算符.
a = a ^ b;
b = a ^ b;
a = a ^ b;
通过这个达到交换a和b两个的值.
作者: 289623337    时间: 2014-9-26 20:28
caixingke 发表于 2014-9-26 19:36
这个不是位运算, +和-不是位运算符.
& | ~ ^这才是位运算符.
a = a ^ b;

我又查了下笔记,的确是我发错了!!!!
作者: 289623337    时间: 2014-9-26 20:42
___瘦不了 发表于 2014-9-26 18:35
呃、、、、
n = n+m;//这一部不说了
m = n-m;//这个式子拆分开来是不是:m = (n+m)-m,也就是说m=n,对 ...

谢谢,我又看了一遍,其实二三步就是把第一步带入和赋值的过程!
作者: 289623337    时间: 2014-9-26 20:43
真的吗?看来这道题的含金量还挺高!
作者: ζ_____________    时间: 2014-9-27 14:36
289623337 发表于 2014-9-26 06:50
多谢上面几位马友的耐心解答,终于搞懂了,我感觉还是引用了一个变量,让mn的值互换了,这种思维就在计算 ...

^^ 谢谢夸奖了...  明白了就好. 一同进步~
作者: 李春丽    时间: 2014-9-27 20:23
其实这个,记住就行,但是为了更加直观一点,告诉你一个方法:


抓两把豆子,分一把做m,在数出一部分做n,然后按着那三步,分分凑凑,你就理解了。:lol
作者: wf111sxwf    时间: 2014-10-9 13:25
置换还可以用………异或来搞定
作者: 希筱诺    时间: 2014-10-9 13:50
只是变量的值做了改变
作者: wf111sxwf    时间: 2014-10-11 00:26
你如果用数学逻辑的话很容易钻牛角尖的 这里的等于号是赋值并不是数学运算里的等于 m n是变量




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