黑马程序员技术交流社区

标题: 谁理解这种变量交换方式? [打印本页]

作者: yedong07a    时间: 2013-5-13 16:12
标题: 谁理解这种变量交换方式?
本帖最后由 yedong07a 于 2013-5-13 17:51 编辑
  1. int n = 3,m = 8;
  2. System.out.println("n="+n+",m="+m);
  3. n = n ^ m;
  4. m = n ^ m; // (n^m)^m
  5. n = n ^ m; // n ^ (n ^ m)
  6. System.out.println("n="+n+",m="+m);
复制代码
谁理解这种变量交换方式?
例如:
7^4
    111
^  100
     011
^  100
     111
作者: 潘贵    时间: 2013-5-13 16:24
一个数亦或同一个数两次得到同一个数,这句话理解就ok。


可以把第一个n^m看成一个变量,当你用它去^n就得m,当你用它去^m就得n。
作者: 潘贵    时间: 2013-5-13 16:24
一个数亦或同一个数两次得到同一个数,这句话理解就ok。


可以把第一个n^m看成一个变量,当你用它去^n就得m,当你用它去^m就得n。
作者: long    时间: 2013-5-13 16:28
楼主先要理解异或操作符(^):1^0 = 1,  0^1 = 1,  0^0 = 0, 1^1 = 0 。
int变量在内存中是用32位二进制补码表示的,n = 3的二进制补码是(0...0)11, m = 8的二进制补码是(0...0)1000。
n = n ^ m;  // n = (0...0)1011, m = (0...0)1000
m = n ^ m;  // m = (0...0)11,  n = (0...0)1011,m = 3
n = n ^ m;  // n = (0...0)1000, n = 8
作者: 翟宝海    时间: 2013-5-13 17:25
^又称为异或,是一个数学运算符,应用于逻辑运算:
    在布尔型运算中:真^真为假、假^假为假、真^假为真、假^真为真;也就是说两个值相同为假,两个值不同为真;
    在二进制值运算中:1表示真、0表示假;因此二进制值的异或运算法则为:0^0为0、1^1为0、0^1为1、1^0为1;
    7^4转换为二进制就是111^100,根据上述运算法则结果为011;将该结果再与4(也就是100)进行异或运算,即011^100,所得结果为111;
    在异或运算中,有一个现象:n^m^m=n;n^m^n=m,即一个数异或同一个数两次,结果还是这个数。








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