您可以使用异或来翻转位 - 将打开的位关闭,反之亦然。例如,这可以方便地交换两个数字而没有空间容纳第三个数字。
0x0A ^ 0xFF = 0x03 ( 00001010 ^ 11111111 = 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 中,按位运算符期望无符号整数)
异或运算也用于“弱加密”。您可以将字符串与(重复的)“代码字”进行异或,结果将是一串毫无意义的字节。再次应用相同的操作,就会出现原来的情况。这是一个相当弱的算法,永远不应该在现实生活中使用。
关于切换位 - 在“过去”,如果你想反转图像,你会这样做pix = pix & 1
对于每个像素 - 或者如果你可以一次执行一个字节,byte = byte & 0xFF
。这会将白色背景上的黑色文本变成黑色背景上的白色文本。我认为 ATARI 拥有一项专利,通过与位图进行异或操作,在“屏幕上的任何位置”创建闪烁的光标。
同样,如果您有一个微控制器想要创建闪烁的灯光,请重复执行state = state XOR 1
将导致状态切换。
最后,有许多依赖于异或运算的“位旋转黑客”。例如,计算一个字的奇偶校验(即设置的位数是奇数还是偶数)可以通过以下方式完成(来源:http://graphics.stanford.edu/~seander/bithacks.html 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;
还有许多其他“聪明的技巧”——当您试图找到最快的方法来完成涉及位操作的事情时,它们通常会出现。大多数人都可以完美地度过一生,但没有真正“得到”它,这没关系。我呢,就喜欢摆弄。