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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 常佳杰 中级黑马   /  2012-6-20 13:26  /  2770 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

具体的解释一下这段代码,b^a是什么意思?
b = b ^ a;
a = b ^ a;
b = b ^ a;

11 个回复

倒序浏览
本帖最后由 余银桂 于 2012-6-20 13:48 编辑

{:soso_e117:}异或运算...


b = b ^ a;
a = b ^ a;  //实际等于 a=(b^a)^a;
b = b ^ a; //实际等于 b=b^(b^a);

这个是利用异或来进行a b的变量交换

一个数 异或两次相同的数 结果还会是原数
回复 使用道具 举报
异或运算交换了两个值的位置..
可以调试下下面的代码,公式没找着,你可以找找看呵呵
  1. public class 异或 {
  2.         public static void main(String[] args) {
  3.                 int a=3;
  4.                 System.out.println("a 二进制为"+Integer.toBinaryString(a));
  5.                 int b=5;
  6.                 System.out.println("b 二进制为"+Integer.toBinaryString(b));
  7.                 b = b ^ a;
  8.                 System.out.println("b=b^a异或结果为"+Integer.toBinaryString(b));
  9.                 a = b ^ a;
  10.                 System.out.println("a=(新的b即(b^a))^a异或结果为"+Integer.toBinaryString(a));
  11.                 b = b ^ a;
  12.                 System.out.println("a=(新的b即(b^a))^新的a即(上面的)异或结果为"+Integer.toBinaryString(a));               
  13.                 System.out.println("a="+a +"   b="+b);               
  14.                 /*通过恒等交换了两个数的位置*/
  15.         }
  16. }
复制代码
回复 使用道具 举报
叫 异或  ,它跟& | !等都是逻辑运算符,^跟|差不多,唯一的区别是true^true=false;其他情况跟|相同。
用在a^b中就是对a和b的二进制数进行异或运算,二进制中的0相当于false,1相当于true。
回复 使用道具 举报
异或  比如:1010^1111=0101
回复 使用道具 举报
异或运算符:(位运算)各位上相同则0,不同则1。异或运算符有一个特征就是:一个数异或同一个数两次,其数值不变(因为a^a=1)
下面是a,b值的变化
b = b ^ a; //b = a^b,a = a;
a = b ^ a;  //b = a^b, a = (a^b)^a = b;
b = b ^ a;//b = (a^b)^a=b, a = b
上述的语句就完成了a的值与b的值的互换,如果是在面试中,这么答题看起来要比设定一个中间变量换值更加有水平不是?
回复 使用道具 举报
^叫 异或  比如true^true=false;用在a^b中就是对a和b的二进制数进行异或运算,二进制中的0相当于false,1相当于true,b = b ^ a;
a = b ^ a;//这句转换为a =(b ^ a)^ a
b = b ^ a;//这句转换为b =((b ^ a)^ a)^a
回复 使用道具 举报
这个是异或运算。
b = b ^ a;
a = b ^ a;
b = b ^ a;
这三条语句其实是对a,b的值进行交换!
  1. class YH
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int a=3,b=5;
  6.                 b = b ^ a;
  7.                 a = b ^ a;
  8.                 b = b ^ a;
  9.                 System.out.println("a="+a+",b="+b);
  10.         }
  11. }
复制代码
输出结果a=5,b=3
回复 使用道具 举报
孙飞 中级黑马 2012-6-20 18:21:48
9#
本帖最后由 feigecal 于 2012-6-20 18:22 编辑

这主要是一句结论的应用:一个数异或同一个数两次结果不变。你的代码是先把b^a赋给了b,那么b最初的值就没有了,现在的b是原来的b和a异或后的值,第二行是a=b^a;这里的b是第一行运算后的b,他在内存中的值是原来的b与a异或后的值,就是用原来的b^a再去^a就得到了原来的b,就把最初的b的值赋给了a。那么此时的a在内存中的值就成了原来的b的值了,第三行,是用第一行运算后的b的值去异或第二行运算后的a的值,因为第一行运算后的b的值是最初的a与b的异或,第二行运算后a的值就是最初的b的值,那么第三行就相当于用最初的a的值去异或了最初的b的值两次,结果还是最初的a的值,然后把它赋给了b,这样就把最初的a和b的值调换了。
回复 使用道具 举报
这次一次与或运算,就是把a和b都换成2进制数以后相同为0不同为1.
举个例子吧:
比如a转换成2进制以后是010010,b转换成2进制数位101100
那么 b=a^b=010010^101100结果就是111110
       a=b^a=111110^010010结果为101100
       b=b^a=111110^101100结果为010010
其实你刚才的那段代码的主要功能就是交换a和b的值。
回复 使用道具 举报
本帖最后由 周兴中 于 2012-6-24 02:27 编辑

"^"逻辑运算符(异或),逻辑运算符用于连接boolean类型的表达式,两边不一样时,既一边真一边假,结果为真;当两边都一样时,既两边假或两边真时,结果为假
假设b=true a=false ;
b = b ^ a;//  由于^两边不同,结果为b被赋值ture
a = b ^ a;//  由于^两边不同,结果为a被赋值ture
b = b ^ a;//  由于^两边相同,结果为b被赋值false

假设b=false a=true ;
b = b ^ a;//  由于^两边不同,结果为b被赋值ture
a = b ^ a;//  由于^两边相同,结果为a被赋值false
b = b ^ a;//  由于^两边相同,结果为b被赋值true

从上可见,ab的值进行了互换,所以此方法一般在不使用第3方变量的情况下,用户交换两个变量的值

同时"^"也是位运算符.当作为位运算符时,会将^两边的整数类型的变量(byte,short,int,long)转换成二进制进行异或运算,任何相同二进制位进行^运算,结果是0,  不相同二进制位^运算结果是1;
二进制1就是true,0就是false

假设 a=7 ,b=4 ;转换成2进制, a=0111  b=0100
b = b ^ a;//    0111
                   ^0100
                      0011
既b最后赋值为0011
a = b ^ a;//    0011      相当于 a =  (b ^ a)  ^ a;   根据结论  a = b;
                   ^0100
                     0111
既此时a为0111            
b = b ^ a; //  0011        由于在上一个语句中 a 已经被赋值为b, 所以此句相当于 b =(b ^ a)^ b ;   根据结论 b = a;   完成了两个变量的互换.
                  ^0111
                    0100
既b此时为0100

从此也可以看出,一个数异或同一个数两次,结果还是那个数.
该方法一般在不使用第3方变量的情况下,用户交换两个变量的值.
回复 使用道具 举报
异或运算,这是二进制的运算符。所以异或,就是只要不一样就为真,否则为假。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马