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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜正冬 中级黑马   /  2012-11-12 14:35  /  2738 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

x=x^y;
y=x^y;
x=x^y;第三种方法虽然效率高,但是可读性差,不容易理解。
"^"这个什么意思 怎么读啊

点评

那就好好看看视频就懂了  发表于 2012-11-12 17:39

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

11 个回复

倒序浏览
异或  真异或假的结果是真,假异或真的结果也是真,真异或真的结果是假,假异或假的结果是假。就是说两个值不相同,则异或结果为真。反之,为假。

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 madianguo 于 2012-11-12 15:48 编辑

按位异或运算符^        参与运算的两个值,如果两个相应位相同,结果为0,否则为1.   0^0=0;   0^1=1; 1^0=1; 1^1=0;

x=x^y;   
y=x^y;
x=x^y;通过异或运算实现了a,b值的互换。

X=5; 0101
Y=3; 0011
X=X^Y  0101^0011=0110
Y=X^Y  0110^0011= 0101
X=X^Y   0110^0101=0011




评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
还是不懂
回复 使用道具 举报
╭ァ純純欲動╰_ 发表于 2012-11-12 16:14
还是不懂

我的乖乖   例子都写出来了 你哪里还不明白  你说说的看看的
回复 使用道具 举报
"^"这个是念 异或
真异或假的结果是真,假异或真的结果也是真,真异或真的结果是假,假异或假的结果是假。就是说两个值不相同,则异或结果为真。反之,为假。 不同为1,相同为0,如1001异或1010等于0011.

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
崔雪 初级黑马 2012-11-12 16:48:28
7#
  1. public class Test7
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 // & 按位与
  6.                 //看这行像什么,像逻辑运算符哪里我们写的吧
  7.                 //0为假,1为真,那么结论就是第四行为1
  8.                 //而在运算方面,我们可以根据这个规则进行
  9.                 //逐位运算,即同为1为1,否则为0
  10.                 System.out.println(0 & 0);
  11.                 System.out.println(0 & 1);
  12.                 System.out.println(1 & 0);
  13.                 System.out.println(1 & 1);
  14.                 System.out.println("======================================>");
  15.                 //可以明确的看到只有最后1位都为1吧,结果就是1
  16.                 System.out.println(getIntegerToBinary(3).substring(24));
  17.                 System.out.println(getIntegerToBinary(5).substring(24));
  18.                 System.out.println(getIntegerToBinary(3 & 5).substring(24));
  19.                 System.out.println("======================================>");
  20.                 //在观察这个我们发现一点有趣的现象?
  21.                 System.out.println(getIntegerToBinary(7).substring(24));
  22.                 System.out.println(getIntegerToBinary(5).substring(24));
  23.                 System.out.println(getIntegerToBinary(7 & 5).substring(24));
  24.                 System.out.println("======================================>");
  25.                 //一排1也就是-1 & 任何数,结果还是他自己
  26.                 //可以发现所有任意数为1的位都和-1中的该位
  27.                 //重合
  28.                 //可以把这个理解成数学中的求交集
  29.                 System.out.println(getIntegerToBinary(-1));
  30.                 System.out.println(getIntegerToBinary(1644687));
  31.                 System.out.println(getIntegerToBinary(-1 & 1644687));
  32.                 System.out.println("======================================>");
  33.                 //任何数和0 进行&操作都会得到0,这个操作经常用来清0
  34.                 //而在数学中,任何集合都不可能和一个空集产生交集
  35.                 System.out.println(getIntegerToBinary(0));
  36.                 System.out.println(getIntegerToBinary(1644687));
  37.                 System.out.println(getIntegerToBinary(0 & 0));
  38.                 System.out.println("======================================>");
  39.                 //这里可以看到,0x1f是前边我们讲的拿一个数最后5位,
  40.                 //而这个0xaaaaaaaa,最后五位01010,前边数据被抛弃
  41.                 //这里可以很简单的综合上边的结论,0x1f的5位前都是0吧?
  42.                 //任何数跟0 & 都是0,而后边是不是跟咱们的-1那个很像?
  43.                 //而这个数跟1排1 & 还是自己吧?
  44.                 //这个操作我们叫做取指定位
  45.                 System.out.println(getIntegerToBinary(0x1f));
  46.                 System.out.println(getIntegerToBinary(0xaaaaaaaa));
  47.                 System.out.println(getIntegerToBinary(0x1f & 0xaaaaaaaa));
  48.                 System.out.println("======================================>");
  49.                 //0xaaaaaaaa 中间的0不太好看拿了多少位,所以用-1
  50.                 System.out.println(getIntegerToBinary(0xffffffff));
  51.                 //取后四位
  52.                 System.out.println(getIntegerToBinary(0xf & 0xffffffff));
  53.                 //取前四位
  54.                 System.out.println(getIntegerToBinary(0xf0000000 & 0xffffffff));
  55.                 //同时取前四位和后四位,至于怎么玩,那是你自己的事情。
  56.                 //在这里我们用的是16进制,那么16进制表示的是4位2进制位
  57.                 //表示16进制的1位,所以我们只需要写8位。
  58.                 //如果觉得16进制的4位有点大,可以考虑用8进制,但是不好用
  59.                 //一般人都不认识,再说位不是整除的32/3你还少1位,蛋疼
  60.                 System.out.println(getIntegerToBinary(0xf000000f & 0xffffffff));
  61.                 System.out.println("======================================>");
  62.                
  63.                 // | 按位或
  64.                 //有一个为1,就为1,看着就懂,不多说
  65.                 //这个运算符可以当成数学中的求并集
  66.                 System.out.println(0 | 0);
  67.                 System.out.println(0 | 1);
  68.                 System.out.println(1 | 0);
  69.                 System.out.println(1 | 1);
  70.                 System.out.println("======================================>");
  71.                 //可以看到,结果是111,这就是 | 的用法,低3位都有1出现,所以是111
  72.                 System.out.println(getIntegerToBinary(3).substring(24));
  73.                 System.out.println(getIntegerToBinary(5).substring(24));
  74.                 System.out.println(getIntegerToBinary(3 | 5).substring(24));
  75.                 System.out.println("======================================>");
  76.                 //有趣的现象又来了,呵呵
  77.                 System.out.println(getIntegerToBinary(7).substring(24));
  78.                 System.out.println(getIntegerToBinary(5).substring(24));
  79.                 System.out.println(getIntegerToBinary(7 | 5).substring(24));
  80.                 System.out.println("======================================>");
  81.                 //-1 | 上任何数,结果还是-1,只能说-1这个集合里涵盖了你的任何组合
  82.                 System.out.println(getIntegerToBinary(-1));
  83.                 System.out.println(getIntegerToBinary(1644687));
  84.                 System.out.println(getIntegerToBinary(-1 | 1644687));
  85.                 System.out.println("======================================>");
  86.                 //0 | 上任何数,结果还是这个数,这个操作没什么太多实际意义
  87.                 //但如果是开发中,发现|操作的值没有改变,你首先应该想到|0了
  88.                 System.out.println(getIntegerToBinary(0));
  89.                 System.out.println(getIntegerToBinary(1644687));
  90.                 System.out.println(getIntegerToBinary(0 | 1644687));
  91.                 System.out.println("======================================>");
  92.                 //这个你会发现是往上填数据
  93.                 System.out.println(getIntegerToBinary(0));
  94.                 System.out.println(getIntegerToBinary(0xf));
  95.                 //低4位填1
  96.                 System.out.println(getIntegerToBinary(0 | 0xf));
  97.                 //高4位填1,这里没写0xf0000000,就是说一下这个数怎么来的
  98.                 System.out.println(getIntegerToBinary(0 | (0xf << 28)));
  99.                 //高低四位同时填1      0 | 0xf000000f是一样的
  100.                 System.out.println(getIntegerToBinary(0 | (0xf | (0xf << 28))));
  101.                 System.out.println("======================================>");
  102.                
  103.                 // ^ 按位异或
  104.                 //两位不一样为1,一样为假
  105.                 System.out.println(0 ^ 0);
  106.                 System.out.println(0 ^ 1);
  107.                 System.out.println(1 ^ 0);
  108.                 System.out.println(1 ^ 1);
  109.                 System.out.println("======================================>");
  110.                 //有效位的头两位都是不一样的吧,所以最后结果是110
  111.                 System.out.println(getIntegerToBinary(3).substring(24));
  112.                 System.out.println(getIntegerToBinary(5).substring(24));
  113.                 System.out.println(getIntegerToBinary(3 ^ 5).substring(24));
  114.                 System.out.println("======================================>");
  115.                 //这个更有趣,有什么发现?好好想想
  116.                 System.out.println(getIntegerToBinary(7).substring(24));
  117.                 System.out.println(getIntegerToBinary(5).substring(24));
  118.                 System.out.println(getIntegerToBinary(7 ^ 5).substring(24));
  119.                 System.out.println("======================================>");
  120.                 //这是神马?还没发现么?传说中的取反
  121.                 System.out.println(getIntegerToBinary(-1));
  122.                 System.out.println(getIntegerToBinary(1644687));
  123.                 System.out.println(getIntegerToBinary(-1 ^ 1644687));
  124.                 //有什么感想?呵呵
  125.                 System.out.println((-1 ^ 1644687) + 1);
  126.                 System.out.println("======================================>");
  127.                 //0 ^ 上任何数,结果还是这个数,这让我们想起来什么了呢?
  128.                 //跟按位或一样的是吧。
  129.                 System.out.println(getIntegerToBinary(0));
  130.                 System.out.println(getIntegerToBinary(1644687));
  131.                 System.out.println(getIntegerToBinary(0 ^ 1644687));
  132.                 System.out.println("======================================>");
  133.                 //按位异或的魅力不止于此,它可以实现局部取反
  134.                 System.out.println(getIntegerToBinary(0x6ffffff6));
  135.                 //低4位取反
  136.                 System.out.println(getIntegerToBinary(0x6ffffff6 ^ 0xf));
  137.                 //高4位取反
  138.                 System.out.println(getIntegerToBinary(0x6ffffff6 ^ 0xf0000000));
  139.                 //高低四位同时取反
  140.                 System.out.println(getIntegerToBinary(0x6ffffff6 ^ 0xf000000f));
  141.                 System.out.println("======================================>");
  142.                
  143.                 // ~ 取反运算符
  144.                 // 0变1 1变0
  145.                 //但跟 ^ 不一样,~是全取反,不能实现局部取反
  146.                 System.out.println(getIntegerToBinary(0));
  147.                 System.out.println(getIntegerToBinary(~0));
  148.                 System.out.println("======================================>");
  149.                 System.out.println(getIntegerToBinary(1));
  150.                 System.out.println(getIntegerToBinary(~1));
  151.                 System.out.println("======================================>");
  152.         }
  153.        
  154.         public static final String DEFAULT_INT_ZERO = "00000000000000000000000000000000";
  155.         public static final String getIntegerToBinary(int value)
  156.         {
  157.                 String binary = Integer.toBinaryString(value);
  158.                 int length = Integer.SIZE - binary.length();
  159.                 return DEFAULT_INT_ZERO.substring(0, length) + binary;
  160.         }
  161. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 李连闯 于 2012-11-12 17:29 编辑

异或的基本规则(不同为真-->1,相同为非-->0):0^0=0;  0^1=1; 1^0=1; 1^1=0;
这四句话其实还隐藏了一个含义,
从这两句0^0=0;  0^1=1; 0与0异或 或是 0与1异或,结果还是0或者1,也就是可以得出 结论1:与0进行异或,得到的值还是本身,不发生改变;
从这两句1^0=1;  1^1=0; 同上可以得出 结论2:与1进行异或,得到的值将是相反的值,也就是0会变成1,1会变成0;

引用下二楼的例子来看:
X=5; 0101(二进制的写法,计算机中存储的数据的形式)
Y=3; 0011
X=X^Y  0101^0011=0110  //此行等号左边的X可以看作是一个标记(下面的两行代码用到的都是这个标记),通过X^Y得到的0110,
                                         //0110中等于0的位表示原始值中X和Y在这个位上的数值是相同的,
                                         //0110中等于1的位表示原始值中X和Y在这个位上的数值是不相同的,
//下面的两行代码就是利用这个相同与不同的标记来实现二者值的互换的,留下相同的,不同的部分变成相反的(即对方的),也就把自己变成了对方
                                         
Y=X^Y   0110^0011= 0101//等号右边的Y的值与原始的Y相同,与标记(即此时的X)异或之后,
                                         //原始的X,Y值相同的位(即标记0110中所有0标记的位置)的数值不会发生改变(依据结论1),
                                         //原始的X,Y值不相同位(即标记0110中所有1标记的位置)的数值会变成相反的值(依据结论2),
                                         //于是得到的值其实就是原始的X的值
X=X^Y   0110^0101=0011 //此处的道理同上,因为把X作为了标记,所以这一行要放到最后,否则标记X的值就会被覆盖。

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
异或运算,一个数与一个数异或两次还是它本身,就是这样的,仔细琢磨一下吧。
回复 使用道具 举报
'^'异或的规则是相同为假,相异为真,楼主代码是利用一个数异或两次同一个数结果还是那个数的规则来实现数据交换的,
你的三个式子实现交换的步骤是把第一句中x分别代入第二三句:第二句:y=x^Y^Y 结果是X把值赋给了y,第三句x=x^x^Y结果把y赋给了x于是实现数据的交换

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 雾殇 于 2012-11-28 17:49 编辑

我尽我所能的解释  如果还是不太清楚可以联系我  qq:362336190 注明:黑马 谢谢
异或简而言之就是  两位不同才为1   
1.如果两个数相同那么每一位肯定相同    所以a^a的结果是每一位都为0  即结果是0
2.如果一个数与0异或的话  还是原值   因为0^1=1 0^0=0
以上两点没有问题的话也就差不多了 可以往下看
下面依次来解答(:冒号后的x y都指的是一开始的x和y)
x=x^y;  :  
y=x^y;  : y=x^y=(x^y)^y=x^(y^y)=x^0=x
x=x^y;  : x=(x^y)^(x^y^y)=x^(x^x)^(y^y)=y^0=y
所以以上三条语句  完成了 x与y的互换操作   在循环比较上的情况下效率不会优化太多
建议以后使用临时变量  增加程序的可读性  谢谢!
回复 使用道具 举报
陈重 初级黑马 2012-11-28 17:49:24
12#
这些规则不用记,记也不好记.这是一个基本的逻辑运算符.基本的逻辑符:与,或,非.真值表什么的也不用记.与的意思是,同时满足两个条件则事件达成.或是只需满足一个条件事件即可达成.非就不用说了.在这的基础上就有了异或运算.拆开来看:异,或.第一步你要看参与运算的是否满足"异"这个条件,满足条件则进行或运算.不满足,直接挂.同或也是,分两步看.其实在给符号命名时,别人已经告诉你他的运算规则了.还有与非,或非就不一一说明了.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马