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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马睿 中级黑马   /  2012-9-16 12:55  /  1760 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  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,为什么?




真神奇……

评分

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

查看全部评分

4 个回复

倒序浏览
第二步原先的b是01吗?应该还是原先的10吧
回复 使用道具 举报
第二步原先的b是01吗?应该还是原先的10吧
回复 使用道具 举报
第二步原先的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: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);
        }

点评

嗯这样应该对了  发表于 2012-9-16 14:04

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马