Java-异或运算^

^这个运算符是按位异或运算,就是位运算

x^=y^=y; 这个语句可以看做下面的两条语句

y=y^y;(y和y的值都是一样的  所以按位异或运算后,y=0)

x=x^y;(这里的y已经在上面一条语句中变成0了,x在和y按位异或运算的话  ,值还是x)

public static void main(String[] args) {
      int x = 1984;
      int y = 2001;
      x^= y^= x^= y;
      System.out.println("x="+x+"; y= "+y);
  }
//结果y=1984,x=0

 

 

或许不少做过c语言或者c++的朋友都知道,如果是整形数据xy,通过x^=y^=x^=y ,就可以交换x和y的值。但是如果想在java中这么做,那就哈哈哈哈~这里写图片描述

让我们直接看一下这么做的后果:

瞧见了没,y是变成1了,但是x却并不等于2,而是等于0。

首先我们来解析一下,如果通过异或来交换两个整数,其正确流程如下:

x = x ^ y;
y = y ^ x;
x = y ^ x;
  • 1
  • 2
  • 3

然而在java中上述表达式实际运行情况又是怎样呢?

        int tmp1 = x;
        int tmp2 = y;
        int tmp3 = x ^ y;
        x = tmp3;
        y = tmp2 ^ tmp3;
        x = tmp1 ^ y;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这是因为在java中,操作符的操作数是从左向右求值的,比如计算x^=expr的值时,在计算expr前先提取x的值,然后将异或的结果赋值给x。因此在上面的式子中,x实际上被提取了两次,但是两次提取都发生在所有的赋值以前,也就是两次提取前,其值是一样的,而这就是错误的源泉。

上面的是不是看的很懵,没关系,看一下改正后的代码,再结合上面的解释就很好理解了,

y=(x^=(y^=x))^y;
  • 1

运行截图如下:

这里写图片描述

编程学习

Java-简答题

2020-9-19 1:31:43

编程学习

Java-选择题

2020-9-19 22:18:10

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索