Algorithm 这一解决方案背后的直觉;最大化XOR“;

Algorithm 这一解决方案背后的直觉;最大化XOR“;,algorithm,logic,bit-manipulation,bitwise-operators,xor,Algorithm,Logic,Bit Manipulation,Bitwise Operators,Xor,以下是问题陈述: 给定两个整数:L和R, 求给定的A或B的最大值,L≤ A.≤ B≤ R 输入格式: 输入包含两行,L出现在第一行中。 R在第二行 限制条件: 1.≤ L≤ R≤ 一千 输出格式 问题陈述中提到的最大值 资料来源: 以下是针对上述问题的一个独特解决方案: def maxXOR(L,R): P = L^R ret = 1 while(P): # this one takes (m+1) = O(logR) steps ret <<

以下是问题陈述:

给定两个整数:L和R, 求给定的A或B的最大值,L≤ A.≤ B≤ R

输入格式:

输入包含两行,L出现在第一行中。 R在第二行

限制条件: 1.≤ L≤ R≤ 一千

输出格式 问题陈述中提到的最大值

资料来源:

以下是针对上述问题的一个独特解决方案:

def maxXOR(L,R):
    P = L^R
    ret = 1
    while(P): # this one takes (m+1) = O(logR) steps
        ret <<= 1
        P >>= 1
    return (ret - 1)
print(maxXOR(int(input()),int(input())))
def maxXOR(左,右): P=L^R ret=1 而(P):#这一步需要(m+1)=O(logR)步 ret=1 返回(ret-1) 打印(maxXOR(int(input()),int(input())) 你能解释一下这个解决方案背后的直觉吗


谢谢。

有一种简单的方法可以解决
O(1)
中的问题

让我们开始:

  • L
    R
    执行按位异或运算,并将其存储在变量中,例如
    xored
  • 然后将设置的
    xored
    中的
    MSB
    作为
    1
    ,这就是答案
下面的例子将使事情变得清楚

L = 10111 --> (23)   
R = 11100 --> (28)
    _X___  <-- that's most significant differing bit
    01111  <-- here's our final answer i.e. (15).

注意:您可以参考
C
C++
中的解决方案,将问题陈述直接包含在问题中。否则,当链接稍后断开时,没有人会知道这个问题是关于什么的。这里有一个提示-如果L和R有一个共同的前缀,那么L和R之间的每个数字也有相同的前缀,并且这两个数字的每一个可能的XOR都会将该前缀置零。前缀后面的其他位采用不同的值,并且这些位的XOR的最大值将在两个值互为补充时出现,这将给出所有值的XOR结果。因此,对于某些N,每一个可能的最终结果都是形式2^N-1。我想说,这实际上是一个非常巧妙的解决方案,尽管有点不明显-P