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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yedong07a 中级黑马   /  2013-5-13 16:12  /  1422 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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

4 个回复

正序浏览
^又称为异或,是一个数学运算符,应用于逻辑运算:
    在布尔型运算中:真^真为假、假^假为假、真^假为真、假^真为真;也就是说两个值相同为假,两个值不同为真;
    在二进制值运算中: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,即一个数异或同一个数两次,结果还是这个数。



回复 使用道具 举报
楼主先要理解异或操作符(^):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
回复 使用道具 举报
一个数亦或同一个数两次得到同一个数,这句话理解就ok。


可以把第一个n^m看成一个变量,当你用它去^n就得m,当你用它去^m就得n。
回复 使用道具 举报
一个数亦或同一个数两次得到同一个数,这句话理解就ok。


可以把第一个n^m看成一个变量,当你用它去^n就得m,当你用它去^m就得n。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马