黑马程序员技术交流社区

标题: 谁能给我讲解下异或运算。 [打印本页]

作者: 274997322    时间: 2013-6-8 23:34
标题: 谁能给我讲解下异或运算。
具体以下面这个运算为例,
int a , b ;
a = a^b;
b = a^b;
a = a^b;
我看代码的时候说这段代码是交换a,b值的。但是没弄懂。
作者: 蔡志涛    时间: 2013-6-9 00:19
你说的这个运算是按位运算,异或运算符^可以进行按位运算。
首先给你介绍一下异或运算符^的基本用法:比如 var1=var2^var3;  那么如果var2或var3中有且仅有一个是true,var1的值就是true,否则为false。
其次,在按位运算中,异或运算符的用法是:如果操作数中相同位置上的位有且仅有一个是1,其结果位就是1,否则为0。
这里的位是指把操作数转换成二进制的形式。
作者: 274997322    时间: 2013-6-9 00:25
蔡志涛 发表于 2013-6-9 00:19
你说的这个运算是按位运算,异或运算符^可以进行按位运算。
首先给你介绍一下异或运算符^的基本用法:比如  ...

求再具体解释解释后面的按位运算。什么叫做相同位置上的位有且有一个是1。
作者: 彭家贰小姐    时间: 2013-6-9 08:25
请楼主看下这个帖子
http://bbs.itheima.com/forum.php ... D180%26typeid%3D180
已有说明
作者: 彭家贰小姐    时间: 2013-6-9 08:48
以下是我理解
(此方式用的原理是 a=a^b^b 及一个数亦或另一个数两次 及还是这个数本身 下面我们验证一下)
a=3写成二进制是00000011
b=6写成二进制是00000110
我们先来看下 a^b 结果
       00000011
       00000110
-----------------------
       00000101
及 a^b  = 3^6 = 5
我们再用5^6试试
       00000101
       00000110
----------------------
       00000011
及5^6 = 3
也就是  a^b^b = 3^6^6 = 3
这是它的原理 这个原理在真正实践中被用来加密 因为中间数(6)只有本人知道 所以 要想解密就必须知道这个中间数

下面我们就来看下
int a , b ;
a = a^b;
b = a^b;
a = a^b;

它每一步都是将 a储存空间的数据 与 b储存空间的数据 进行异或 你要理解 在每一步 这两个储存空间的值 是多少
a存储空间         b储存空间

      a                       b
                  |
                  |
            a = a^b;
                  |
                  |
a存储空间         b储存空间

    a^b                     b
                  |
                  |
    b = a^b = (a^b)^b = a;
                  |
                  |
a存储空间        b储存空间

    a^b                    a
                  |
                  |
    a = a^b=(a^b)^a=b;
                  |
                  |
a存储空间        b储存空间   

        b                     a


这样就实现交换了 楼主懂了木?      

作者: 关关雎鸠    时间: 2013-6-9 08:54
本帖最后由 关关雎鸠 于 2013-6-9 09:02 编辑

看了楼上的,感觉楼上还是晕乎乎的~

你就记住相同的为0,不同的为1。
比如0和0或1和1,结果为0。

为了更好的理解,用数字代替字母更好理解。
int a = 1, b = 0;

a = 1^0;  //结果为1   (a = a^b)

b = 1^0;  //结果为1   (b = a^b)

a = 1^1;  //结果为0   (a = a^b)

现在a = 0、b = 1,是不是交换值了?

作者: 许大虾    时间: 2013-6-9 09:02
1. a ^ a = 0
2. a ^ b = b ^ a
3. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
4. d = a ^ b ^ c 可以推出 a = d ^ b ^ c.
5. a ^ b ^ a = b.
6.若x是二进制数0101,y是二进制数1011
则x^y=1110
只有在两个比较的位不同时其结果是1,否则结果为0
即“相同为0,不同为1”!
作者: 彭家贰小姐    时间: 2013-6-9 13:14
关关雎鸠 发表于 2013-6-9 08:54
看了楼上的,感觉楼上还是晕乎乎的~

你就记住相同的为0,不同的为1。


我有写错吗?:)
作者: popoluno    时间: 2013-6-9 14:30
你说的这个运算是按位运算,异或运算符^可以进行按位运算。
如果两边中有且仅有一个是true那么结果就是true,否则为false。
其次,在按位运算中,异或运算符的用法是:如果操作数中相同位置上的位有且仅有一个是1,其结果位就是1,否则为0。
作者: 李奔    时间: 2013-6-10 00:49
既然还没有懂,我就看重复一次。
假设a=5,b=10;(注意:这里是按位异或运算,也就是先把a,b分解成二进制数再运算。)
按位异或运算法则:相同为0,不同为1.(如0^1=1,0^0=0)
a=a^b; 即为 a=101^1010=1111,即a=15
b=b^a;即为b=1010^1111=0101,即b=5
a=a^b,即为a=1111^0101=1010,即a=10.
明白了吗?
作者: 一直在努力    时间: 2013-6-10 00:51
彭家贰小姐 发表于 2013-6-9 08:48
以下是我理解
(此方式用的原理是 a=a^b^b 及一个数亦或另一个数两次 及还是这个数本身 下面我们验证一下)
a ...

强...............
作者: ljh4282158    时间: 2013-6-10 21:33
看了楼上晕乎乎的。给你讲个简单的例子 ,补充说明:
int  num1 =1;
int   num2=2;
int  num3;
num3=(num1^num2);
Console.WriteLine(num3);
程序运行的结果是 84.
两个整数执行“异或”运算时。如果两个对应的位一个是1,而另外一个是0,则返回的结果位是1.如果两个整数的相应位都是1 或者都是0,则返回位是0;
如代码中 1对应的二进制数为00000001   ,85对应的二进制数是01010101,根据异或运算的原理  二进制结果就是 01010100 转换成十进制就是84   
  




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