探讨一下异或(xor)为什么能还原的问题

数学表示:

        a ^ a ^ b = b;

        a ^ b ^ a = b;

        b ^ a ^ a = b;

原理:

可用穷举法证明:

     异或运算:1 ^ 1 = 0;1 ^ 0 = 1;  0 ^ 1 = 1;  0 ^ 0 = 0;

     穷举:


       



              1 ^ 1 ^ 1 = 1;

              1 ^ 1 ^ 0 = 0;

              1 ^ 0 ^ 1 = 0;

              0 ^ 1 ^ 1 = 0;

              1 ^ 0 ^ 0 = 1;

              0 ^ 1 ^ 0 = 1;

              0 ^ 0 ^ 1 = 1;

              0 ^ 0 ^ 0 = 0;

     可知任意1或0出现两次,即可抵消。

     从而推广至多个位(bit)。

     一个数异或同一个数两次,结果还是那个数。  且异或的顺序可变。

如何证明这个结论呢?

观察xor的运算, 我们可以得出一个结论, 其实xor相当于不进位的加法。

举个例子:

num1: .byte 0b0

num2: .byte 0b1

情况1

xorb 0, num1 #结果 num1 = 0b0 相当于 0 + 0 = 0

xorb 1,num1 #结果 num1 = 0b1 相当于 1 + 0 = 1

情况2

xorb 0, num2 #结果 num2 = 0b1 相当于 0 + 1 = 1

xorb 1,num2 #结果 num2 = 0b0 相当于 1 + 1 = 0b10, 进位被直接舍弃, 最后num2 = 0b0

所以上述 a xor b xor b == a, 可以先理解成 a + b + b == a 这个等式

假如 a 和 b 就是单纯的 一个bit位

那么在这两次的连加中, 不管有没有进位,最后连加的结果的最低位一定等于a (这其中b是可以 == a的)

这是二进制加法的特性,但是要注意的是连加的次数一定要是2的倍数,而且连加的被加数b一定要不变 (这其中b是可以 == a的)

有了这个特性我们回过头去看xor

上面说了xor相当于不进位的加法,所以 a+b+b 最后计算的结果所有的进位全被舍弃,自然而然保留的结果一定 == a

现在将a和b括展到多个bit位,那么原理是一样的, a xor b xor b, 还是相当于 a + b + b, xor会将每个对应的 bit位 都做 连续的加法,由于是不进位的,所以每次对应的bit位的连加是互不影响的,所以最后整个结果 所有的二进制bit位都相没有变, 所以最后的结果一定是a

xor上述这样的运算特性,可以做一些简单的加密

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值