打印
[技术求助]

按位异或的几个常见用途

[复制链接]
6198|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
heweibig|  楼主 | 2011-11-22 18:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
zhaoxqi| | 2011-11-22 18:47 | 只看该作者
使某些特定的位翻转

使用特权

评论回复
板凳
zhaoxqi| | 2011-11-22 18:47 | 只看该作者
例如对数10100001的第2位和第3位翻转,则可以将该数与00000110进行按位异或运算。
       10100001^00000110 = 10100111

使用特权

评论回复
地板
jiajs| | 2011-11-22 18:50 | 只看该作者
实现两个值的交换,而不必使用临时变量。

使用特权

评论回复
5
jiajs| | 2011-11-22 18:50 | 只看该作者
例如交换两个整数a=10100001,b=00000110的值,可通过下列语句实现:
    a = a^b;   //a=10100111
    b = b^a;   //b=10100001
    a = a^b;   //a=00000110

使用特权

评论回复
6
huangchui| | 2011-11-22 18:53 | 只看该作者
在汇编语言中经常用于将变量置零:

使用特权

评论回复
7
huangchui| | 2011-11-22 18:53 | 只看该作者
xor   a,a

使用特权

评论回复
8
zhanghqi| | 2011-11-22 18:55 | 只看该作者
快速判断两个值是否相等

使用特权

评论回复
9
zhanghqi| | 2011-11-22 18:55 | 只看该作者
举例1: 判断两个整数a,b是否相等,则可通过下列语句实现:
        return ((a ^ b) == 0)

使用特权

评论回复
10
wyjie| | 2011-11-22 18:58 | 只看该作者
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);
    }

使用特权

评论回复
11
yszong| | 2011-11-22 19:00 | 只看该作者
图像处理中其实异或用得比较多,比如叠加一个台标,然后你又想从叠加后的节目中去掉台标了,那么你只要有台标的原始图像,然后你就可以再异或一次,就可以还原原始节目了。

使用特权

评论回复
12
yszong| | 2011-11-22 19:00 | 只看该作者
只是大概举个例子,目前大多娄电视台的台标是直接覆盖在节目上面的,这样的节目是无法还原的。

使用特权

评论回复
13
zjk103| | 2012-8-27 14:41 | 只看该作者
verify=0;
for (j=1; j<g_cReceNum; j++)
            {   verify ^= g_cReceBuf[j];    }
这段代码是起什么作用呢??

使用特权

评论回复
14
sqcumt123| | 2012-8-27 17:04 | 只看该作者
我以为LZ是分享的那

使用特权

评论回复
15
万古长空| | 2012-8-27 19:07 | 只看该作者
:funk:楼主这个内容太分散了

使用特权

评论回复
16
airwill| | 2012-8-27 20:25 | 只看该作者
verify=0;
for (j=1; j<g_cReceNum; j++)
            {   verify ^= g_cReceBuf[j];    }
这段代码是起什么作用呢??

这段代码就是生成校验码. xor 是一种不错的校验算法.用于数据的错误校验.
xor 作为数据的基本算法之一, 也经常用在数据加密运算中.

使用特权

评论回复
17
wjzx111056| | 2012-8-29 20:06 | 只看该作者
首先得明白按位异或的3个特点:
(1) 0^0=0,0^1=1  0异或任何数=任何数
(2) 1^0=1,1^1=0  1异或任何数-任何数取反
(3)              任何数异或自己=把自己置0

使用特权

评论回复
18
yanxi| | 2012-9-3 09:45 | 只看该作者
在操作一些单片机IO口时可能会用到按位异或

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

869

主题

13089

帖子

7

粉丝