黑马程序员技术交流社区

标题: 请教啊!! [打印本页]

作者: 新手123    时间: 2014-7-15 22:45
标题: 请教啊!!
class    Demo
{
        public static void main(String[] args)
        {
                int a=1,b=2;
                a=a^b;
                b=a^b;
                a=a^b;
                System.out.println("a="+a+",b="+b);
        }
}
//结果是 a=2,b=1
我没没明白  
                         int a=1,b=2;
                a=a^b;   1=1^2
                b=a^b;   1=1^2^2   b就等于1了
                a=a^b;   a=1^1^1   ........迷惑 b都已经等于1了  值已经改变了  a 是怎么=2的呢


作者: 赵顺超    时间: 2014-7-15 22:54
异或运算符是用符号“^”表示的,其运算规律是:
两个操作数的位中,相同则结果为0,不同则结果为1。
作者: wisely    时间: 2014-7-15 22:55
^是位运算的或。

a和b都是int型,由于位运算是按二进制运算的,所以将a和b转换为二进制。
a=00000000-00000000-00000000-00000001
b=00000000-00000000-00000000-00000010
第一步:a=a^b=00000000-00000000-00000000-00000000-00000011=3;
第二步(简写):b=a^b=11^10=01=1;
第三步(简写):a=a^b=11^01=10=2

所以a=2,b=1

我说的明白么?
作者: hjfeng1987    时间: 2014-7-15 22:55
    int a=1,b=2;
    a=a^b;   a=1^2
    b=a^b;   b=1^2^2   b就等于1了
    a=a^b;   a=(1^2)^ 1  
是这样吧,a=1^2
作者: 赵顺超    时间: 2014-7-15 22:58
a的二进制,1,补齐两位01,b的二进制10,那么,a异或b就等于11,十进制就是3。第二个,就是11异或10,结果01。第三个就是11异或01,就是10,就是2。所以a最后十进制是2,b是1
作者: 刘小印    时间: 2014-7-15 23:02
a=a^b;
b=(a^)^b=a=1;现在的b=a=1;了
a=(a^b)^((a^b)^b)=(a^b)^a=b=2,这里是原来的b,所以是2

作者: fantacyleo    时间: 2014-7-15 23:04
傻瓜式解读:http://bbs.itheima.com/forum.php ... mp;page=1#pid854231
作者: 新手123    时间: 2014-7-15 23:23
进制转换我明白  但是  按照  同一个数异或俩次还等与这个数的道理我还是不明白
  就是
       int a=1,b=2;
                a=a^b;   1=1^2
           这就里的     b=a^b;   《1=1^2^2》   b就等于1了 !!!~~~~~~~~~~~~~  
       这句意思不就是         a=a^b;   a=1^1^1吗????根本就没有2了  
作者: 新手123    时间: 2014-7-15 23:25
刘小印 发表于 2014-7-15 23:02
a=a^b;
b=(a^)^b=a=1;现在的b=a=1;了
a=(a^b)^((a^b)^b)=(a^b)^a=b=2,这里是原来的b,所以是2

b 怎么能是原来的2 呢  这是 Java的规定?、
作者: 新手123    时间: 2014-7-15 23:30
hjfeng1987 发表于 2014-7-15 22:55
int a=1,b=2;
    a=a^b;   a=1^2
    b=a^b;   b=1^2^2   b就等于1了


    int a=1,b=2;
    a=a^b;   a=1^2
    b=a^b;   b=1^2^2   b就等于1了   您想想   b=1
    a=a^b;   a=(1^2)^ 1  这里那里来的2啊   a=a^b 的  b 不是1吗
是这样吧,a=1^2
作者: hjfeng1987    时间: 2014-7-15 23:40
新手123 发表于 2014-7-15 23:30
int a=1,b=2;
    a=a^b;   a=1^2
    b=a^b;   b=1^2^2   b就等于1了   您想想   b=1

int a=1,b=2;
    a=a^b;   a=1^2  
    b=a^b;   b=1^2^2   b就等于1了   您想想   b=1
    a=a^b;   a=(1^2)^ 1  这里那里来的2啊   a=a^b 的  b 不是1吗
第一步a=a^b,a这时候已经赋值为1^2啊, b的值变成1000都好,跟a无关啊

就好比
int a=1,b=2;
a=a+b;   1+2
b=4,
a会变成 1+4吗?



作者: hjfeng1987    时间: 2014-7-15 23:43
hjfeng1987 发表于 2014-7-15 23:40
int a=1,b=2;
    a=a^b;   a=1^2  
    b=a^b;   b=1^2^2   b就等于1了   您想想   b=1

:lol不知道我理解得对不对,我也在学习,一起努力啊
作者: icris    时间: 2014-7-15 23:52
  1. int a=1,b=2; // 省略前28位0…
  2. a=a^b; // a = 0001 ^ 0010 = 0011
  3. b=a^b; // b = 0011 ^ 0010 = 0001
  4. a=a^b; // a = 0011 ^ 0001 = 0010
  5. System.out.println("a="+a+",b="+b); // a = 0010 = 2, b = 0001 = 1
复制代码





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