公益网站 做公益赚钱,谷歌云搭建wordpress,做网站的人怎么联系,博客园wordpress模板原标题#xff1a;C语言总结之异或运算的一些特性及巧妙应用1#xff0e;一个数和自己做异或的结果是0。如果需要一个常数0#xff0c;x86平台的编译器可能会生成这样的指令#xff1a;xorl %eax, %eax。不管eax寄存器里的值原来是多少#xff0c;做异或运算都能得到0C语言总结之异或运算的一些特性及巧妙应用1一个数和自己做异或的结果是0。如果需要一个常数0x86平台的编译器可能会生成这样的指令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 00 ^ 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相当于上面公式中的xa0相当于y所以结果为a0第三行把a和b的新值代入得到a a0 ^ b0 ^ a0结果为b0。注意这个过程不能把同一个变量跟自己交换而利用中间变量temp则可以交换。0异或001异或010异或111异或10(同为0异为1。程序中有三种演算子XOR、xor、 ^。口诀相同取0相异取1。(二进制)异或的巧妙应用C语言中若需要交换两个变量的值除了通常使用的借用中间变量进行交换外还可以利用异或仅使用两个变量进行交换如aa^b;ba^b;aa^b;这样就完成了a与b的交换。返回搜狐查看更多责任编辑