黑马程序员技术交流社区
标题:
一道关于连续异或赋值的神奇问题……
[打印本页]
作者:
马睿
时间:
2012-9-16 12:55
标题:
一道关于连续异或赋值的神奇问题……
public void main(String[] args)
{
int a = 1,b = 2;
a^=b^(b^=a^b);
System.out.println(a+" "+b);
}
复制代码
实际输出结果为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