这个解决方案背后的直觉是为了最大化XOR"

时间:2014-11-05 17:54:45

标签: algorithm logic bit-manipulation bitwise-operators xor

以下是问题陈述:

给出两个整数:L和R, 找到给定的A xor B的最大值,L≤A≤B≤R

输入格式:

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

限制条件: 1≤L≤R≤1000

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

来源: Maximising XOR

以上是一个独特的解决方案:

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())))

你能解释一下这个解决方案背后的直觉吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

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

让我们开始吧:

  • LR进行按位XOR并将其存储在变量xored中。
  • 然后将已设置的MSB中的xored设为MSB -----> LSB,并将来自该1的所有位设为L = 10111 --> (23) R = 11100 --> (28) _X___ <-- that's most significant differing bit 01111 <-- here's our final answer i.e. (15).

下面的例子可以使事情变得清楚。

MSB

要设置从LSB2^n - 1的所有位,请首先计算n = number of bits required to represent L^R,其中L^R | (2^(n) - 1),然后执行import math def main(): xored = int(input().strip()) ^ int(input().strip()) print("{}".format(xored | ((1 << (1 + int(math.log2(xored)))) - 1))) if __name__ == "__main__": main()

Python解决方案:

C

注意:您可以在C++ -<ResponseData> <Type value="7" id="Level"/> <Type value="67.80" id="Score"/> </ResponseData> here!中引用解决方案。