黑马程序员技术交流社区

标题: 位运算的问题 [打印本页]

作者: 淮阴少年    时间: 2015-3-6 21:25
标题: 位运算的问题
/*
        面试题:
                请自己实现两个整数变量的交换
                注意:以后讲课的过程中,我没有明确指定数据的类型,默认int类型。
*/
class OperatorTest {
        public static void main(String[] args) {
                int a = 10;
                int b = 20;
               
                System.out.println("a:"+a+",b:"+b);
               
                //方式1:使用第三方变量(开发中用的)
                /*
                int c = a;
                a = b;
                b = c;
                System.out.println("a:"+a+",b:"+b);
                System.out.println("------------");
                */
               
                //方式2:用位异或实现(面试用)
                //左边:a,b,a
                //右边:a ^ b
                /*
                a = a ^ b;
                b = a ^ b; //a ^ b ^ b = a
                a = a ^ b; //a ^ b ^ a = b
                System.out.println("a:"+a+",b:"+b);
                */
               


作者: 金康俊    时间: 2015-3-6 21:25
淮阴少年 发表于 2015-3-7 19:28
a=a^b;
b=a^b;//这里^后面的b值是20//那第一个b 不是被赋值10 了么
a=a^b;//这里的b的值是10 、、那既然 ...

首先,a=a^b;   //  (10^20)算出a的结果为二进制11110,也就是10进制的30.
接着,b=a^b   //  a连续两次^同一个数(30^20),算出结果为10,赋予了b,也就是10
最后,a=a^b   //  a^b也就是(30^10),和上面的那个值已经不一样了,最终的结果是20.
作者: 淮阴少年    时间: 2015-3-6 21:27
        b = a ^ b; //a ^ b ^ b = a
                a  //a ^ b ^ a = b

b已经变a 那是不是表示 b已经 是10  
那第二行   a = a ^ b; //a ^ b ^ a = b  不是也是10?
不是很懂
作者: 小田    时间: 2015-3-6 22:10
a=a+b;
b=a+b-b;
a=a-b;
System.out.println("a:"+a+",b:"+b);
                System.out.println("------------");
作者: 小田    时间: 2015-3-6 22:12
a=a+b;
b=a-b;
a=a-b;
System.out.println("a:"+a+",b:"+b);
                System.out.println("------------");
作者: zailushang326    时间: 2015-3-6 23:14
a=a^b
根据异或规则a=30
b = a ^ b; //a ^ b ^ b = a
b变成10
a=a^b//(a^b)^a=b
a=20
a与b交换
作者: 金康俊    时间: 2015-3-7 10:44
a=a^b;
b=a^b;//这里^后面的b值是20
a=a^b;//这里的b的值是10
作者: 淮阴少年    时间: 2015-3-7 19:28
金康俊 发表于 2015-3-7 10:44
a=a^b;
b=a^b;//这里^后面的b值是20
a=a^b;//这里的b的值是10

a=a^b;
b=a^b;//这里^后面的b值是20//那第一个b 不是被赋值10 了么
a=a^b;//这里的b的值是10 、、那既然第二行b=10  那这里的a不还是10  怎么变成20了
作者: 唐泉银    时间: 2015-3-11 10:36
答案都被大家说了我就没啥说的了 加油吧各位
作者: One_M    时间: 2015-3-11 13:14
a=a^b==>A     //相当于a=A(新二进制);
b=a^b=A^b=a^b^b=a  //b就得到a的值 b=a;
a=a^b=a^b^a=b  // a就相当于A^a  a=b;
这样就实现了a b对换;最好就是自己带数字进去多算几次就OK 了~! 开始我也没太懂~!~~  一起加油~
作者: 虚谷    时间: 2015-3-12 07:51
又学会了一招,非常感谢楼主




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