黑马程序员技术交流社区

标题: 一道关于连续异或赋值的神奇问题…… [打印本页]

作者: 马睿    时间: 2012-9-16 12:55
标题: 一道关于连续异或赋值的神奇问题……

  1. public void main(String[] args)
  2. {
  3.         int a = 1,b = 2;

  4.         a^=b^(b^=a^b);

  5.         System.out.println(a+" "+b);
  6. }
复制代码
实际输出结果为a=2   b=1





a^=b^(b^=a^b);
我的理解(以下用二进制表达)
(1)先最右的
结果记做calc1   : a^b=01^10=11

(2)b^=a^b            也就是 b = b^calc1                 也就是b = 10^11=01

此处b=1


(3)b^(b^=a^b);    其实就是b^b是吧????前面的部分计算好了      也就是01^01咯?应该为00  我记做calc2=00


(4)a^=b^(b^=a^b);         也就是a=a^calc2   咯?   a=01^00=01

结果a=1

而正确结果a=2,为什么?




真神奇……
作者: 张 涛    时间: 2012-9-16 13:11
第二步原先的b是01吗?应该还是原先的10吧
作者: 张 涛    时间: 2012-9-16 13:11
第二步原先的b是01吗?应该还是原先的10吧
作者: 马睿    时间: 2012-9-16 13:34
第二步原先的b是01吗?应该还是原先的10吧

如果是原先的b=01

b^=a^b那么b=01^calc1=01^11=10

b=2  也就是10
(3)(3)b^(b^=a^b);    其实就是b^b是吧????前面的部分计算好了      也就是10^10咯?应该为11  我记做calc2=00

(4)a^=b^(b^=a^b);         也就是a=a^calc2   咯?   a=01^00=01
a=1

按照这样逻辑结果是a=1 b=2
而实际输出是a=2 b=1

……继续求解……谁知道?
作者: 谭立文    时间: 2012-9-16 13:40
本帖最后由 谭立文 于 2012-9-16 13:45 编辑

public static void main(String[] args)
        {
                   int a = 1,b = 2;
               a^=b^(b^=a^b);
               /*
                * 异或运运输的特点是 0^0=0,0 ^ 1 = 1,1 ^ 1 = 0;
                */
             //a ^ b  0001^0010 0011
             //b = b ^(a^b) 0010^0011 0001    b最后一次值发生改变也是第一次
             //b ^ 0001 = 0010 ^ 0001 = 0011   这里b的值并没有改变
             //a = a ^ 0011 = 0001 ^ 0011 = 0010;
             //b 最终值 = 0001;
             //a 最终值= 0010;
              System.out.println("a=" + a);
              System.out.println("b=" + b);
        }




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