[技术求助] 按位异或常见用途是什么啊

[复制链接]
1181|20
 楼主| zhaoxqi 发表于 2019-8-18 12:32 | 显示全部楼层 |阅读模式
按位异或常见用途是什么啊
jiahy 发表于 2019-8-18 12:34 | 显示全部楼层
使某些特定的位翻转
jiaxw 发表于 2019-8-18 12:37 | 显示全部楼层

对,例如对数10100001的第2位和第3位翻转,则可以将该数与00000110进行按位异或运算。
       10100001^00000110 = 10100111
huangchui 发表于 2019-8-18 12:40 | 显示全部楼层

实现两个值的交换,而不必使用临时变量。
spark周 发表于 2019-8-18 12:43 | 显示全部楼层
对,例如交换两个整数a=10100001,b=00000110的值,可通过下列语句实现:
    a = a^b;   //a=10100111
    b = b^a;   //b=10100001
    a = a^b;   //a=00000110
午夜粪车 发表于 2019-8-18 12:48 | 显示全部楼层

在汇编语言中经常用于将变量置零
huangchui 发表于 2019-8-18 12:50 | 显示全部楼层
xor   a,a
zhanghqi 发表于 2019-8-18 12:54 | 显示全部楼层
快速判断两个值是否相等
zhenykun 发表于 2019-8-18 12:56 | 显示全部楼层

举例1: 判断两个整数a,b是否相等,则可通过下列语句实现:
         return ((a ^ b) == 0)
jlyuan 发表于 2019-8-18 12:59 | 显示全部楼层
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);
     }
dengdc 发表于 2019-8-18 13:09 | 显示全部楼层
图像处理中其实异或用得比较多,比如叠加一个台标,然后你又想从叠加后的节目中去掉台标了,那么你只要有台标的原始图像,然后你就可以再异或一次,就可以还原原始节目了。
wuhany 发表于 2019-8-18 13:11 | 显示全部楼层
只是大概举个例子,目前大多娄电视台的台标是直接覆盖在节目上面的,这样的节目是无法还原的。
zhanghqi 发表于 2019-8-18 13:15 | 显示全部楼层

verify=0;
for (j=1; j<g_cReceNum; j++)
             {   verify ^= g_cReceBuf[j];    }
这段代码是起什么作用呢??
zhenykun 发表于 2019-8-18 13:19 | 显示全部楼层

verify=0;
for (j=1; j<g_cReceNum; j++)
             {   verify ^= g_cReceBuf[j];    }
这段代码是起什么作用呢??

这段代码就是生成校验码. xor 是一种不错的校验算法.用于数据的错误校验.
xor 作为数据的基本算法之一, 也经常用在数据加密运算中.
 楼主| zhaoxqi 发表于 2019-8-18 13:21 | 显示全部楼层
首先得明白按位异或的3个特点:
(1) 0^0=0,0^1=1  0异或任何数=任何数
(2) 1^0=1,1^1=0  1异或任何数-任何数取反
(3)              任何数异或自己=把自己置0
dengdc 发表于 2019-8-18 14:03 | 显示全部楼层
在操作一些单片机IO口时可能会用到按位异或
jiahy 发表于 2019-8-18 14:07 | 显示全部楼层

检测上升沿和下降沿也有用
key_sta表示现在状态;
key_pre表示前一状态;
检测上升沿key_sta&(key_pre^key_sta)
检测下降沿key_pre&(key_pre^key_sta)
lizye 发表于 2019-8-18 14:10 | 显示全部楼层
异或校验
jiaxw 发表于 2019-8-18 14:13 | 显示全部楼层
这个做校验的吧
 楼主| zhaoxqi 发表于 2019-8-18 14:16 | 显示全部楼层
搞定了,呵呵,犯了低级错误……结贴啦,多谢各位
您需要登录后才可以回帖 登录 | 注册

本版积分规则

808

主题

10636

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部