发布于 2026-01-06 0 阅读
0

指尖上的位运算 🙌👩🏻‍💻 背景手指方法 AND OR XOR NOT 结论

位运算,指尖轻触即可完成 🙌👩🏻‍💻

背景

手指法

或者

异或

不是

结论

我第一次接触位运算是在 2017 年参加 Advent of Code 挑战赛的时候。当时我完全懵了。“两个数怎么能做 AND 运算呢?这根本说不通!” 我只能乖乖地用当时用的编程语言(可能是 Go)里的 AND 运算符,然后就接受了自己不知道它到底是什么意思的事实。

我下一次接触到这个概念是在一个工作场所的讨论小组里,我们学习了如何使用 AND 运算符来过滤数据包tcpdump。我问了很多问题,最终理解了这些位运算的原理,我想在本文中分享我总结出的一种方法。这种方法需要用手指进行二进制计数,然后用手进行位运算——完全不需要电脑。我不知道是否有人用过类似的方法,但我发现它很实用。

背景

你使用的任何计算机系统都使用二进制(以 2 为基数)将信息表示为一系列 0 和 1。位运算符对每一位执行布尔运算,从而得出最终结果。

例如,假设我们要找到 6 和 3。

0110 (6) 
0011 (3)
----
0010 (2)
Enter fullscreen mode Exit fullscreen mode

分析如下:

在 2^0(个位)上,第一个值为 0(假),第二个值为 1(真)。假且真 = 假。

在 2^1(2 的个位)上,第一个值是 1(真),第二个值也是 1(真)。真且真 = 真。

在 2^2(4 的那个数位)上,第一个值为 1(真),第二个值为 0(假)。真且假 = 假。

在 2^3(8 的那个数)位上,第一个值为 0(假),第二个值为 0(假)。假且假 = 假。

总结起来:对于每个位置或列,对该列中的输入值执行布尔逻辑运算,以获得该列的输出。

执行其他位运算时,可以使用相同的过程。

或者(如果任一值为真则为真):

0110 (6) 
0011 (3) 
----
0111 (7) 
Enter fullscreen mode Exit fullscreen mode

XOR(如果两个值不同则为真):

0110 (6) 
0011 (3) 
----
0101 (5) 
Enter fullscreen mode Exit fullscreen mode

NOT 是一个一元运算符,也就是说它只接受一个输入,并且它会反转每一列(或位)的值。

0101 (5) 
----
1010 (10)
Enter fullscreen mode Exit fullscreen mode

你可以使用这个计算器进行位运算

手指法

我们将从学习用二进制数手指开始。

有些手指计数系统以拇指开始,但我打算用食指代表 1,因为这样每只手就代表一个半字节( nibble),可以用一个十六进制数字表示。(这也意味着我可以用拇指按住其他不用的手指。)中指代表 2,无名指代表 4,小指代表 8。

1,或 0001:

食指向上,其他手指向下

2,或 0010:

中指竖起,其他手指向下

3,或 0011,或 2^1 + 2^0:

中指和食指向上,其余手指向下

7,或 0111,或 2^2 + 2^1 + 2^0:

无名指、中指、食指向上,小指向下

12,或 1100,或 2^3 + 2^2,或十六进制的 C:

小指和无名指向上,中指和食指向下

15,或 1111,或 2^3 + 2^2 + 2^1 + 2^0,或十六进制的 F:

所有手指都竖起来

对于“与”运算,用左手表示第一个数字,右手表示第二个数字。每只手的食指始终代表 1,小指代表 8。

左边是6,右边是3。

现在将双手并拢,掌心相贴,手指呈帐篷状。

顶部相触的手指代表答案(2)。

更多例子:

12 和 7 等于 4

10 和 5 等于 0

或者

让我们使用相同的输入,但使用 OR 运算符。

左边是6,右边是3。

现在将双手并拢,掌心相贴,手指呈帐篷状。

至少举起一根手指的地方代表答案(7)。

更多例子:

12 或 7 = 15

10 或 5 = 15

8 或 1 = 9

异或

左边是6,右边是3。

现在将双手并拢,掌心相贴,手指呈帐篷状。

竖起一根手指的地方代表答案(5)。

更多例子:

12 XOR 7 = 11

10 异或 5 = 15

不是

把所有举起的手指都放下;把所有放下的手指都举起来。

5 不等于 10

结论

现在你知道如何用手指进行位运算了!希望这能帮助你更直观地理解这些运算。

文章来源:https://dev.to/emcain/bitwise-operations-on-your-fingers-2d01