数字可以用二进制表示,如下所示:
3 = 000011
5 = 000101
10 = 001010
我将会假设您熟悉二进制。
按位与是指将两个数字排列在一起,并创建一个新数字,其中两个数字都为1的位置上有一个1(其他位置为0)。
例如:
3 => 00011
& 5 => 00101
------ -------
1 00001
按位或是指将两个数字排列在一起,并创建一个新的数字,其中任何一个数字为1的地方都会有1(其他所有位置都是0)。
例如:
3 => 00011
| 5 => 00101
------ -------
7 00111
按位异或(exclusive OR)是指将两个数字排列在一起,创建一个新的数字,在其中一个数字为1且另一个数字为0的位置上放置1(其他位置上都为0)。
例如:
3 => 00011
^ 5 => 00101
------ -------
6 00110
按位非(Not OR)指的是对两个数进行按位或操作,然后将所有结果反转(原来为0的变成1,原来为1的变成0)。
按位非与(Not AND)指的是对两个数进行按位与操作,然后将所有结果反转(原来为0的变成1,原来为1的变成0)。
继续说,为什么
word &= 15
会将除了最右边的4个比特位之外的所有位置为0?现在你应该能够理解了...
n => abcdefghjikl
& 15 => 000000001111
------ --------------
? 00000000jikl
(0 AND a = 0
, 0 AND b = 0
, ... j AND 1 = j
, i AND 1 = i
, ...)
这个语句有什么用处呢?在许多编程语言中,我们使用所谓的“位掩码”。位掩码本质上是一个代表许多小数合并在一起的数字。我们可以使用OR将数字组合在一起,并使用AND将它们分开。例如:
int MagicMap = 1;
int MagicWand = 2;
int MagicHat = 4;
如果我只有地图和帽子,我可以表达为myInventoryBitmask = (MagicMap | MagicHat)
,结果是我的比特掩码。如果我什么也没有,那么我的比特掩码就是0。如果我想要查看我是否有魔杖,我可以执行以下操作:
int hasWand = (myInventoryBitmask & MagicWand);
if (hasWand > 0) {
printf("I have a wand\n");
} else {
printf("I don't have a wand\n");
}
你明白吗?
编辑:更多内容
你还会遇到“位移”运算符:<< 和 >>。这只是意味着“将所有东西向左移动n位”或“将所有东西向右移动n位”。
换句话说:
1 << 3
= 0001 << 3
= 0001000
= 8
和:
8 >> 2
= 01000 >> 2
= 010
= 2