二,复习位运算

我们先来复习一下 C 语言中,6 种代表性的位运算,OpenResty 的组件 LuaJIT 中的位运算只是稍有差异。为清晰起见本文中称呼所有的位运算的函数为「按位 XX」。

1,运算符

序号 运算符 含义
1 & 按位与 AND
2 ` ` 按位或 OR
3 ^ 按位异或 XOR
4 >> 按位右移 right shift
5 << 按位左移 left shift
6 ~ 按位取反 NOT

2,位运算的示例

布尔代数:1 为真、0 为假。

以下示例都只用 0 和 1 两个数字参与运算。

2.1,按位与 (AND)

按位与(AND)与常用的布尔代数完全一致。

运算规则:同为 1 则 1,有 0 则 0。

辅助记忆:两个和尚抬水吃,有一个不合作,就没水吃了。

二,复习位运算 - 图1

2.2,按位或 (OR)

按位或(OR)也与常用的布尔代数完全一致。

运算规则:同为 0 则 0,有 1 则 1。

辅助记忆:一个和尚挑水吃,两个和尚可以都去挑水,如果都不去,就没水吃了。

二,复习位运算 - 图2

2.3,按位异或 (XOR)

运算规则:相同则为 0,相异则为 1。

辅助记忆:两个和尚做 相同 的事情(都去只顾着吵架了或者都不去)没水吃,必须不同 才有水吃。

二,复习位运算 - 图3

2.4,按位右移(right shift)

运算规则:所有位整体向 右移 n 位,左侧空出来的位补 0

辅助记忆:把一根木条按单位锯成一堆小方块,每锯掉一块,向右移动 1 个单位(bit)。

示例:把二进制数 100110 向右移 3 位。

  1. 100110 >> 3 = 000100

二,复习位运算 - 图4

Tips:向右移一位,相当于将此数 除以 2(原数变小了)。

2.5,按位左移(left shift)

运算规则:所有位整体向 左移 n 位,右侧空出来的位补 0

辅助记忆:贪吃蛇游戏,只是每次都把小方块放在最后边。

  1. 100110 << 3 = 110000

示例:把二进制数 100110 向左移 3 位。

二,复习位运算 - 图5

Tips:向左移一位,相当于将此数 乘以 2(原数变大了)。

2.6,按位取反(NOT)

把数字的二进制表示形式的每一位的 0 变为 1,1 变为 0。

辅助记忆:谍战剧中的角色反转。

二,复习位运算 - 图6