1121098405 发表于 2014-10-5 09:30:56

学习笔记之位运算

问题:有两变量:int a = 10, b = 20;
怎样实现不借助中间变量交换两变量的值?使之 a = 20, b = 10?

其实很简单,只要如下就可以了
   a = a ^ b;      //异或运算符" ^ "   它的规则是1 ^ 0 ->1   0 ^ 0 ->0   即 任何数与0异或 都不变;
   b = a ^ b;       //                                             1 ^ 1 ->0   0 ^ 1 ->1   即 无论是0还是1与1异或都会实现反转即0变成11变成0
   a = a ^ b;

分析:

    a=10的二进制   0000 1010
    b=20的二进制   0001 0100
    a = a ^ b就是   0001 1110      
    b = a ^ b          0000 1010      是不是就等于10?
    a = a ^ b          0001 0100      是不是就等于20?


再次分析:
a = a ^ b;
b = a ^b;   // 我们把a代入进去看看    即b = a ^ b ^ b          其中b ^ b 不就等于0吗 即b = a ^ 0前面说过 任何数与0异或都不变所以b = a
a = a^b;      //我们再代入看看                a = a ^ b ^ a ^ b ^ b         别被这些搞糊涂哦再按照上面的规则 是不是得出 a = b ?
                   //                                       注意了等号右边的a和b都是最初始的

大个的糖果 发表于 2014-11-1 01:51:11

页: [1]
查看完整版本: 学习笔记之位运算