我是位运算符的新手。
我了解逻辑函数如何工作以获得最终结果。例如,当您按位 AND
两个数字时,最终结果将是这两个数字的 AND
(1 & 0 = 0
; 1 & 1 = 1
; 0 & 0 = 0
)。与 OR
、XOR
和 NOT
相同。
我不明白的是他们的应用。我试着到处寻找,其中大部分只是解释按位运算的工作原理。在所有的位运算符中,我只了解移位运算符(乘法和除法)的应用。我也遇到了掩蔽。我知道屏蔽是使用按位 AND
完成的,但它的目的到底是什么,我可以在哪里以及如何使用它?
您能否详细说明我如何使用 mask ? OR
和XOR
有类似的用途吗?
按位运算符的低级用例是执行以 2 为底的数学运算。有一个众所周知的技巧来测试一个数字是否是 2 的幂:
if ((x & (x - 1)) == 0) {
printf("%d is a power of 2\n", x);
}
但是,它还可以提供更高级别的功能:设置操作。您可以将比特的集合视为一个集合。解释一下,让一个字节中的每一位代表 8 个不同的项目,比如我们太阳系中的行星(冥王星不再被视为行星,所以 8 位就足够了!):
#define Mercury (1 << 0)
#define Venus (1 << 1)
#define Earth (1 << 2)
#define Mars (1 << 3)
#define Jupiter (1 << 4)
#define Saturn (1 << 5)
#define Uranus (1 << 6)
#define Neptune (1 << 7)
然后,我们可以像使用 |
一样形成行星的集合(子集):
unsigned char Giants = (Jupiter|Saturn|Uranus|Neptune);
unsigned char Visited = (Venus|Earth|Mars);
unsigned char BeyondTheBelt = (Jupiter|Saturn|Uranus|Neptune);
unsigned char All = (Mercury|Venus|Earth|Mars|Jupiter|Saturn|Uranus|Neptune);
现在,您可以使用 &
来测试两个集合是否有交集:
if (Visited & Giants) {
puts("we might be giants");
}
^
操作通常用于查看两个集合之间的不同之处(集合的并集减去它们的交集):
if (Giants ^ BeyondTheBelt) {
puts("there are non-giants out there");
}
因此,将 |
视为并集,将 &
视为交集,并将 ^
视为并集减去交集。
一旦您接受了位表示集合的想法,那么位运算自然会帮助操作这些集合。