数字可以用二进制表示,如下所示:
3 = 000011
5 = 000101
10 = 001010
...ETC。我假设你熟悉二进制。
按位与表示取两个数字,将它们排成一行,然后创建一个新数字,其中两个数字都为 1(其他数字均为 0)。
例如:
3 => 00011
& 5 => 00101
------ -------
1 00001
按位或表示取两个数字,将它们排成一行,然后创建一个新的数字,该数字为 1,其中任一数字为 1(其他均为 0)。
例如:
3 => 00011
| 5 => 00101
------ -------
7 00111
按位异或(异或)意味着取两个数字,将它们排列在一起,并创建一个新的数字,其中一个数字为 1,另一个数字为 0(其他均为 0)。
例如:
3 => 00011
^ 5 => 00101
------ -------
6 00110
按位或非(非或)意味着取两个数字的按位或,然后将所有内容反转(有一个 0,现在有一个 1,有一个 1,现在有一个 0)。
按位与非(非与)意味着取两个数字的按位与,然后反转所有内容(有 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");
}
得到它?
编辑:更多的东西
您还会遇到“bitshift”运算符:<< 和 >>。这只是意味着“将所有内容左移 n 位”或“将所有内容右移 n 位”。
换句话说:
1 << 3
= 0001 << 3
= 0001000
= 8
和:
8 >> 2
= 01000 >> 2
= 010
= 2