异或运算的一些特性
2012-10-10 17:52
225 查看
1.一个数和自己做异或的结果是0。如果需要一个常数0,x86平台的编译器可能会生成这样的指令:
xorl %eax, %eax。不管eax寄存器里的值原来是多少,做异或运算都能得到0,这条指令比同样效果的
movl $0, %eax指令快,直接对寄存器做位运算比生成一个立即数再传送到寄存器要快一些。
2.从异或的真值表中可以看出,和0做异或保持原值不变,和1做异或得到原值的相反值。可以利用这个特性配合
掩码实现某些位的翻转,例如:
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;的办法。利用位运算可以这样做交换:
分析一下这个过程。为了避免混淆,把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则可以交换。
0异或0=0,1异或0=1,0异或1=1,1异或1=0(同为0,异为1。
程序中有三种演算子:XOR、xor、 ^。
口诀:相同取0,相异取1。(二进制)
异或的巧妙应用
C语言中若需要交换两个变量的值,除了通常使用的借用中间变量进行交换外,还可以利用异或,仅使用两个变量进行交换,如:
a=a^b;
b=a^b;
a=a^b;
这样就完成了a与b的交换。
xorl %eax, %eax。不管eax寄存器里的值原来是多少,做异或运算都能得到0,这条指令比同样效果的
movl $0, %eax指令快,直接对寄存器做位运算比生成一个立即数再传送到寄存器要快一些。
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则可以交换。
0异或0=0,1异或0=1,0异或1=1,1异或1=0(同为0,异为1。
程序中有三种演算子:XOR、xor、 ^。
口诀:相同取0,相异取1。(二进制)
异或的巧妙应用
C语言中若需要交换两个变量的值,除了通常使用的借用中间变量进行交换外,还可以利用异或,仅使用两个变量进行交换,如:
a=a^b;
b=a^b;
a=a^b;
这样就完成了a与b的交换。
相关文章推荐
- C语言总结之异或运算的一些特性及巧妙应用
- C语言总结之异或运算的一些特性及巧妙应用
- 异或运算的一些知识
- 一些异或运算以及掩码的奇技淫巧
- USTCOJ 1213 取石子游戏 (经典NIM问题)及一些扩展 与(&) 或 (|)异或 (^)运算性质
- 一些有趣的异或运算
- Java基础概念之三大特性以及一些小知识点
- 关于windows 超级终端与其他一些串口工具的发送数据时的显著不同特性
- Kademlia: 基于异或运算的P2P信息系统(翻译稿)
- ATmega 128的编程的一些基本特性
- HTML5 中的一些新特性
- 异或运算在算法编程题中的应用
- 关于python的一些特性
- 按位与,或,异或运算方法
- BMT硬件之放大器(一):运算放大器的一些注意点
- 逻辑运算(与&,或|,异或^)及其常用作用
- Java一些特性的示例代码
- Find your present!(异或运算)
- 深入了解Node.js中的一些特性
- 深入了解Node.js中的一些特性