C语言位运算之异或 ^

C语言位运算之异或 ^
1.基本概念
C语言提供6种位;这些运算只能应用在有符号或无符号的字符型,短整型,整型和长整型这些整型数据类型之上。
位异或运算符比较两个操作数的对应位是否相同,如果相同则在运算结果的相应位置1,否则置0;
0^0=0
1^1=0
0^1=1
1^0=1
对于任意整型数值 I,J 有以下规律:
I ^ 0xff = ~I
I ^ 0x00 =  I
( I ^ J ) ^ J = I
2.应用
快速判断两个值是否相等
举例1: 判断两个整数a,b是否相等,则可通过下列语句实现:
        return ((a ^ b)==0)
举例2: Linux中最初的ipv6_addr_equal()函数的实现如下:
    static inline int ipv6_addr_equal(const struct in6_addr *a1, const struct in6_addr *a2)
    {
        return (a1->s6_addr32[0] == a2->s6_addr32[0] &&
            a1->s6_addr32[1] == a2->s6_addr32[1] &&
            a1->s6_addr32[2] == a2->s6_addr32[2] &&
            a1->s6_addr32[3] == a2->s6_addr32[3]);
    }
 
    可以利用按位异或实现快速比较, 最新的实现已经修改为:
    static inline int ipv6_addr_equal(const struct in6_addr *a1, const struct in6_addr *a2)
    {
    return (((a1->s6_addr32[0] ^ a2->s6_addr32[0]) |
             (a1->s6_addr32[1] ^ a2->s6_addr32[1]) |
             (a1->s6_addr32[2] ^ a2->s6_addr32[2]) |
             (a1->s6_addr32[3] ^ a2->s6_addr32[3])) == 0);
    }

3.小结

        位运算在位的层次上进行,可以算是在所有高级程序语言里最细微的运算了。对于异或运算而言,当使用者不关心具体的位,仅仅比较两个数值是否相同时,可以和关系运算符!=互相替换。

       但还有很多情况下使用者不仅仅是要比较两个整型数是否相同,而是希望知道二者在那些位不同。这时关系运算符!=就爱莫能助了。还是请出^吧,相同的话得到一个0,不同的话结果为大于0的一个整型.只要看看这个整型数的那些位为1就知道前面两个整型量的哪些位不同。
    总之,对两个整型量作位运算异或^和关系运算 !=,都可以判断二者是否相等。!=运算的结果只能为1或0,而^运算的结果则为0或者一个同样位宽的整数。考察这个整数的哪些位为1,就可以知道参与位运算两个整型值的那些位不同。异或运算在工业控制软件上经常用到。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值