黑马程序员技术交流社区

标题: 两个int数字进行交换不引用第三个变量 [打印本页]

作者: Faulty    时间: 2013-10-30 22:39
标题: 两个int数字进行交换不引用第三个变量

  1. public class Xiaohuihui {
  2.         public static void main(String[] args) {
  3.                 int a = Integer.MAX_VALUE;
  4.                 int b = 12;
  5.                 a = a + b;
  6.                 b = a - b;
  7.                 a = a - b;
  8.                 System.out.println(Integer.MAX_VALUE);
  9.                 System.out.println(a);
  10.                 System.out.println(b);
  11.         }
  12. }
复制代码
不是说这种方法存在bug吗,为什么没有找到
作者: miedongdong    时间: 2013-10-30 22:53
本帖最后由 miedongdong 于 2013-10-30 22:55 编辑

没说过这个会有bug吧
这个也可以用位运算符之中的异或运算 ^
^的原理说明:(实际上是二进制运算)
相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0
不相同二进制位 ^ 运算结果是1。1^0=1 , 0^1=1
例子:6^5
6 的二进制表示:    110
5的二进制表示:   ^101
                           ————
                    011
下面的实现原理就是异或运算后再异或同一个数
异或运算后的数     011
5的二进制表示:  ^ 101
                           ————
                               110  (这就是6的二进制数)

                  
  
02.public class Xiaohuihui {

03.        public static void main(String[] args) {

04.                int a = Integer.MAX_VALUE;

05.               int b = 12;
                    a =a ^ b;
                    b= a^b;
                    a= a^b;

06.           /*     a = a + b;

07.                b = a - b;

08.                a = a - b;   */

09.                System.out.println(Integer.MAX_VALUE);

10.                System.out.println(a);

11.                System.out.println(b);

12.        }

13.}


作者: ixiangfeng    时间: 2013-10-30 23:18
miedongdong 发表于 2013-10-30 22:53
没说过这个会有bug吧
这个也可以用位运算符之中的异或运算 ^
^的原理说明:(实际上是二进制运算)

毕老师说是有bug的 就是当两个数之和超过int类型时会溢出 我也一直是这样觉得的 但楼主说的这个问题我刚才测试过的确地可以转换的 而且两数之和也的确溢出了 要么是毕老师说错了我自己也理解错了 要么就是还有哪里没注意到  求高手指点
作者: miedongdong    时间: 2013-10-30 23:28
ixiangfeng 发表于 2013-10-30 23:18
毕老师说是有bug的 就是当两个数之和超过int类型时会溢出 我也一直是这样觉得的 但楼主说的这个问题我刚 ...

哦哦,当时老师是有说过如果两个数很大的话,就有可能会超出范围,但是一般都没用到这么大的数
你测试异或也超出了吗?怎么我的没有,正常运行啊,而且老师说到用异或是不会超出范围的
作者: ixiangfeng    时间: 2013-10-30 23:39
miedongdong 发表于 2013-10-30 23:28
哦哦,当时老师是有说过如果两个数很大的话,就有可能会超出范围,但是一般都没用到这么大的数
你测试异 ...

老师说的是异或是不会超出的 而楼主所说的方式会的 而且LZ用的是Integer.MAX_VALUE和别一数相加 按毕老师说的话应该会超出范围的 但测试出来的结果两个数还是可以正常交换的 具体什么原因还不清楚 再去仔细想想去
作者: 回天之力    时间: 2013-10-31 00:24
因为是int,所以a=a+b,当a和b很大时,a容易超出int范围。所以有 一定危险。
作者: ixiangfeng    时间: 2013-10-31 08:16
回天之力 发表于 2013-10-31 00:24
因为是int,所以a=a+b,当a和b很大时,a容易超出int范围。所以有 一定危险。

呃 哥们 你有没有看帖子的 人家就是测试出来没有你说的这种情况所以才发帖来问的
作者: 高亮亮    时间: 2013-10-31 08:43
//小练习:将两个变量内部的值进行互换。

//1,通过第三方变量。
int temp;
temp =n;
n=m;
m=temp;
//2,不用第三方变量
/*
11=3+8
8=11-3
2=11-8
*/
n=n+m;
m=n-m;
n=n-m;//但是,这种方法有局限性,如果n,m值非常大,则会超出int范围。

n=n^m;
m=n^m;//^:亦或.。此时的表达式是:(n^m)^m【但是,此时m的值已经变为之前的n的值了】
n=n^m;//                 此时的表达式是:(n^m)^n
//一个数,如果同时对一个数异或两次,那就是原数。




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