位运算,指尖轻触即可完成 🙌👩🏻💻
背景
手指法
和
或者
异或
不是
结论
我第一次接触位运算是在 2017 年参加 Advent of Code 挑战赛的时候。当时我完全懵了。“两个数怎么能做 AND 运算呢?这根本说不通!” 我只能乖乖地用当时用的编程语言(可能是 Go)里的 AND 运算符,然后就接受了自己不知道它到底是什么意思的事实。
我下一次接触到这个概念是在一个工作场所的讨论小组里,我们学习了如何使用 AND 运算符来过滤数据包tcpdump。我问了很多问题,最终理解了这些位运算的原理,我想在本文中分享我总结出的一种方法。这种方法需要用手指进行二进制计数,然后用手进行位运算——完全不需要电脑。我不知道是否有人用过类似的方法,但我发现它很实用。
背景
你使用的任何计算机系统都使用二进制(以 2 为基数)将信息表示为一系列 0 和 1。位运算符对每一位执行布尔运算,从而得出最终结果。
例如,假设我们要找到 6 和 3。
0110 (6)
0011 (3)
----
0010 (2)
分析如下:
在 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)
XOR(如果两个值不同则为真):
0110 (6)
0011 (3)
----
0101 (5)
NOT 是一个一元运算符,也就是说它只接受一个输入,并且它会反转每一列(或位)的值。
0101 (5)
----
1010 (10)
你可以使用这个计算器进行位运算。
手指法
我们将从学习用二进制数手指开始。
有些手指计数系统以拇指开始,但我打算用食指代表 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



























