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,就可以知道参与位运算两个整型值的那些位不同。异或运算在工业控制软件上经常用到。 |
C语言位运算之异或 ^
最新推荐文章于 2024-08-18 22:08:24 发布