设为首页 加入收藏

TOP

15.1.4 异或运算的一些特性
2013-10-12 06:53:06 来源: 作者: 【 】 浏览:91
Tags:15.1.4 运算 一些 特性

15.1.4  异或运算的一些特性

1.一个数和自己做异或的结果是0。如果需要一个常数0,x86平台的编译器可能会生成这样的指令:xorl %eax, %eax。不管eax寄存器里的值原来是多少,做异或运算都能得到0,这条指令比同样效果的movl $0, %eax指令快,直接对寄存器做位运算比生成一个立即数再传送到寄存器要快一些,x86指令将在第17章详细介绍。

2.从异或的真值表中可以看出,和0做异或保持原值不变,和1做异或得到原值的相反值。可以利用这个特性配合掩码实现某些位的翻转,例如:

  1. unsigned int a, b, mask = 1U << 6;  
  2. a = 0x12345678;  
  3. b = a ^ mask; /* flip the 6th bit */ 

3.如果a1 ^ a2 ^ a3 ^ … ^ an的结果是1,则表示a1、a2、a3…an之中1的个数为奇数个,否则为偶数个。这条性质可用于奇偶校验(Parity Check),比如在串口通信过程中,每个字节的数据都计算一个校验位,数据和校验位一起发送出去,这样接收方可以根据校验位粗略地判断接收到的数据是否有误。

4.x ^ x ^ y == y,因为x ^ x == 0,0 ^ y == y。这个性质有什么用呢?我们来看这样一个问题:交换两个变量的值,不得借助额外的存储空间,所以不能采用temp = a; a = b; b = temp;的办法。利用位运算可以这样做交换:

  1. a = a ^ b;  
  2. b = b ^ a;  
  3. a = a ^ b; 

分析一下这个过程。为了避免混淆,把a和b的初值分别记为a0和b0。第一行,a = a0 ^ b0;第二行,把a的新值代入,得到b = b0 ^ a0 ^ b0,等号右边的b0相当于上面公式中的x,a0相当于y,所以结果为a0;第三行,把a和b的新值代入,得到a = a0 ^ b0 ^ a0,结果为b0。注意这个过程不能把同一个变量跟自己交换,而利用中间变量temp则可以交换。

习题

1.请在网上查找有关RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)的资料,理解其实现原理,实际上就是利用了本节的性质3和性质4。

2.交换两个变量的值,不得借助额外的存储空间,除了本节讲的方法之外你还能想出什么方法?本节讲的方法不能把同一个变量跟自己交换,你的方法有没有什么局限性?


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇15.1.1 按位与、或、异或、取反运.. 下一篇15.2.1 复合赋值运算符

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: