加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C中的XOR运算符

发布时间:2020-12-16 10:34:02 所属栏目:百科 来源:网络整理
导读:在进行按位操作时,我无法确定何时使用XOR运算符. Bitwise And和Or非常直接.如果要屏蔽位,请使用按位AND(常见用例是IP寻址和子网掩码).当你想打开位时使用包含或.然而,XOR总是让我感觉如果在面试中被问到需要使用XOR的问题,我将永远不会得到它.有人可以说明何
在进行按位操作时,我无法确定何时使用XOR运算符. Bitwise And和Or非常直接.如果要屏蔽位,请使用按位AND(常见用例是IP寻址和子网掩码).当你想打开位时使用包含或.然而,XOR总是让我感觉如果在面试中被问到需要使用XOR的问题,我将永远不会得到它.有人可以说明何时使用它和一些常见的用例.

解决方法

您使用独占或翻转位 – 打开的位关闭,反之亦然.例如,这对于交换两个数字而没有第三个数字的空间是很方便的.

0x0A ^ 0xFF = 0x03 ( 00001010 ^ 22222111 = 11110101 )

交换数字:

operation   example 
             A      B
initial:   0011    1010
a = a^b;   1001    1010
b = a^b;   1001    0011
a = a^b;   1010    0011

如您所见,数字(本例中为半字节)A和B在不使用额外空间的情况下进行了交换.这适用于任何两个相同类型的数字(尽管在C中,按位运算符期望无符号整数)

XOR操作也用于“弱加密”.您可以使用(重复的)“代码字”获取字符串的XOR,结果将是一串没有意义的字节.再次应用相同的操作,出现原件.这是一个相当弱的算法,永远不应该在现实生活中使用.

关于切换位 – 在“过去的日子”中,如果你想反转一个图像,你会做pix = pix&每个像素1个 – 或者如果你一次可以做一个字节,byte = byte& 0xFF的.这将把白色背景上的黑色文本变成黑色背景上的白色文本.我认为ATARI通过使用位图进行XOR来获得“在屏幕上的任何位置”创建闪烁光标的专利.

类似地,如果您有一个想要创建闪烁灯的微控制器,则重复执行state = state XOR 1将导致状态切换.

最后,有许多依赖于XOR操作的“有点笨拙的黑客”.例如,计算字的奇偶校验(即,设置位的数量是奇数还是偶数)可以通过以下方式完成(来源:http://graphics.stanford.edu/~seander/bithacks.html)

unsigned int v;  // word value to compute the parity of
v ^= v >> 16;
v ^= v >> 8;
v ^= v >> 4;
v &= 0xf;
return (0x6996 >> v) & 1;

还有许多其他“聪明的技巧” – 当你试图找到最快的方法来做一些涉及位操作的事情时,它们通常会出现.大多数人都可以完美地度过生活,而没有真正“得到”它,这没关系.我,我喜欢小摆弄.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读