异或的基本情况
首先说一下异或的概念、表示和计算等基本信息。
概念:通俗一点来讲,二进制非 0 即 1,如果是一位二进制之间做异或操作,相同的异或得到 0,不同的异或得到 1。再说的朴素一点,有点像曾经很火的游戏“大家来找茬”,异或只关注“不同”。
表示:作为数学符号,异或用 ⊕ \oplus ⊕ 表示;程序语言中,c/c++ 和 python 都是 ^。
计算:上面说到概念的时候,用一位二进制来说的,如果是多位二进制的话,就按位操作,遇到位数不同的,位数少的那个二进制数前面(高位)补 0 使得位数一致。
异或的重要性质
以十进制 — 3 位二进制数举例的话:
0 — 000
1 — 001
2 — 010
3 — 011
4 — 100
5 — 101
6 — 110
7 — 111
(下面式子没有明显标注十进制与二进制)
2
⊕
2
=
010
⊕
010
=
000
=
0
2 \oplus 2 = 010 \oplus 010 = 000 = 0
2⊕2=010⊕010=000=0
解释:自身与自身异或 = 0,对嘛,自己跟自己哪儿哪儿都一样,没有不同所以得到 0。
2
⊕
0
=
010
⊕
000
=
010
=
1
2 \oplus 0 = 010 \oplus 000 = 010 = 1
2⊕0=010⊕000=010=1
解释:任何值与 0 异或都会得到其本身。
来的是 0,那跟我一样所以异或为 0 不变;来的要是 1,那跟我不一样所以异或为 1 还是不变。
0 这个数一点主意也没有,从来不抬杠,不管怎样就一句话:“随你~都好~”。
2
⊕
3
=
010
⊕
011
=
011
⊕
010
=
3
⊕
2
=
001
=
1
2 \oplus 3 = 010 \oplus 011 = 011 \oplus 010 = 3 \oplus 2 = 001 = 1
2⊕3=010⊕011=011⊕010=3⊕2=001=1
解释:符合交换律,很友好。
4
⊕
6
⊕
7
=
(
100
⊕
110
)
⊕
111
=
100
⊕
(
110
⊕
111
)
=
101
=
5
4 \oplus 6 \oplus 7 = (100 \oplus 110) \oplus 111 =100 \oplus (110 \oplus 111) = 101 = 5
4⊕6⊕7=(100⊕110)⊕111=100⊕(110⊕111)=101=5
解释:符合结合律,超友好~
4
⊕
6
⊕
4
=
6
⊕
4
⊕
4
=
(
100
⊕
110
)
⊕
100
=
110
=
6
4 \oplus 6 \oplus 4 = 6 \oplus 4 \oplus 4 = (100 \oplus 110) \oplus 100 = 110 = 6
4⊕6⊕4=6⊕4⊕4=(100⊕110)⊕100=110=6
解释:这条是我最感兴趣的,有的称这个性质叫“自反性”。
最想谈的解码与编码
仔细看其实这条性质可以通过前面几条性质推算得到,也就是先交换 6 和后面 4 的位置,然后再先算 4 和 4 异或得到 0,再计算 6 和 0 异或不变又得到 6。
这一点性质用来编码和解码(或者也可以说加密和解密)很有意思。编码可以理解为把原本的信息处理了一下变成了一个新的码;而解码是把刚刚说的新码逆过程回去得到原本的信息。
就像悬崖之上组织间交流的方式,为了不被敌方破获信息,把原本想说的话通过那本书对号写成一堆看起来乱七八糟的数字,然后传出去;自己人就知道再通过那本书翻译解码出来原本的信息。
还可以说是,发信人先把信息“锁”起来,哪怕被人看见了,只要他不会破解,诶信息还是安全的;只有到了同伴那里他才有正确的“钥匙”把信息解锁打开获得最原始的信息。
而上面例子里面异或的这个自反性,6 就是咱们真正要传递的信息,4 就是咱们的“锁”,我把 6 用 4 上锁得到 6 ⊕ 4 = 110 ⊕ 100 = 010 = 2 6\oplus4 = 110 \oplus 100 = 010 = 2 6⊕4=110⊕100=010=2 ,然后我就把 2 跟贴小广告一样贴出去。自己人看见这玩意儿它就知道把 2 拿回去用“钥匙”开锁,这“钥匙”是谁呢?就是刚刚的“锁” 4,开锁过程就是 2 ⊕ 4 = 010 ⊕ 100 = 110 = 6 2\oplus 4 = 010 \oplus 100 = 110 = 6 2⊕4=010⊕100=110=6,自己人就知道了,哦~原本信息是 6。
还想补充说的一点就是,虽然我上面用的锁和钥匙的例子来讲述异或运算编码解码的,但是日常生活中咱们都知道,一般来说一套锁和钥匙虽然肯定关联密切,可是怎么说也完全是两个东西,怎么你这里 4 又当锁又当钥匙呢?
我感觉还是可以自圆其说的,日常生活中一套锁和钥匙虽然不一样,可是他们也是“互补”的,只有合适的那个钥匙怼进锁里达成“互补”才能扭动开锁。那么为什么异或这里的锁和钥匙可以是一样的呢?我觉得正是因为二进制最简单也最不简单,非 0 即 1,非阴即阳,本身就有点“雌雄同体”的意思,所以二进制上做异或编码解码,锁就是钥匙,钥匙就是锁。这也正是异或编码解码很方便的原因,只要双方保存同一份锁/钥匙,就可以顺利编码和解码。简单~
171

被折叠的 条评论
为什么被折叠?



