异或运算性质 与 连续异或运算的加速策略

一、异或运算性质

异或运算(XOR)有几个重要的性质,其中最重要的是:

  • 任何数与0异或都等于其本身‌:a ^ 0 = a
  • 任何数与其自身异或都等于0‌:a ^ a = 0
  • 异或运算满足交换律和结合律‌:a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b

二、加速策略

1. 结论

对于n不是4的倍数的情况,我们只需计算最后一个不完整的组内的数进行异或即可‌;如果n是4的倍数,则整个序列的异或结果为0。

2. 解析

为什么下面的代码可以加速1到n的异或运算? 

        switch (n % 4) {
            case 0: return n;
            case 1: return 1;
            case 2: return n+1;
            default: return 0;
        }

要理解为什么这段代码可以加速1到n的异或运算,我们首先需要知道异或(XOR)运算的一个重要性质:连续数字的异或结果呈现周期性。具体来说,当我们连续异或从1到n的数字时,结果会遵循一个特定的模式,这个模式与n除以4的余数紧密相关。

让我们分析一下1到n的连续异或结果:

  1. 当n是4的倍数时(即n % 4 == 0):
    • 1 ^ 2 ^ 3 ^ 4 = 0(因为1^2=3, 3^3=0(这里3重复了,但异或运算是对称的,所以不影响结果), 0^4=4, 但实际上是1^2^3=0后再异或4,结果仍为4,不过由于周期性,4^4=0(下一个4的倍数时))
    • 这个模式会每4个数字重复一次,因此当n是4的倍数时,最终的结果就是n本身(因为每个周期的异或结果为0,不影响最终累加结果,而n恰好是4的整数倍,所以相当于没有进行任何异或操作,或者是说异或操作互相抵消了)。
  2. 当n除以4余1时(即n % 4 == 1):
    • 1到n的数字中,最后一个数字是某个4的倍数加1(即4k+1),而前面的所有数字可以分成完整的4个数字的周期。
    • 由于每个周期的异或结果为0,所以只需要考虑最后一个数字1(因为它是多余出来的,没有和前面的数字形成完整周期)。
    • 因此,结果是1。
  3. 当n除以4余2时(即n % 4 == 2):
    • 类似于n % 4 == 1的情况,最后一个数字是某个4的倍数加2(即4k+2)。
    • 前面的所有数字形成完整的4个数字的周期,异或结果为0。
    • 只需要考虑最后两个数字1和2的异或结果,即1 ^ 2 = 3,但由于我们是异或从1到n的所有数字,所以实际上要考虑的是这个多余出来的2和前面所有周期异或结果0之后的异或,再加上最后一个周期中未抵消的1(因为每个周期中1^2^3^4=0,但如果没有到下一个完整的4,则最后一个不完整的周期中会有未抵消的数字,这里是1),所以结果是n+1(这里的n实际上是指最后一个完整的4的倍数,所以n+1就是多加了一个未抵消的1和最后的2异或的结果3中的2(因为1^2=3),但由于我们是从1开始异或的,所以实际上相当于是多加了一个整体的1,即n(最后一个完整的4的倍数)+1)。
    • 简化来说,就是每个周期的异或抵消后,最后剩下1(因为每个周期开始于1),然后和最后的2异或,得到3,但由于我们是从1开始计数的,所以结果是n(代表了最后一个完整的周期)+1。
  4. 当n除以4余3时(即n % 4 == 3):
    • 这种情况下,最后一个数字是某个4的倍数加3(即4k+3)。
    • 前面的数字形成完整的4个数字的周期,异或结果为0。
    • 只需要考虑最后三个数字1、2和3的异或结果,即1 3 = 0(这是一个完整的周期,所以异或结果为0)。
    • 因此,最终结果是0。

综上所述,这段代码通过检查n除以4的余数,直接返回了1到n连续异或的结果,而不需要实际进行所有的异或操作。这样,它大大减少了计算量,特别是在n非常大的情况下,从而实现了加速。


------------------------END-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烛火萤辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值