📅  最后修改于: 2023-12-03 15:27:36             🧑  作者: Mango
给定一个正整数范围[x, y],找到一个数对(X, Y),使得X和Y在范围内,且它们的按位与是最大的。同时X和Y可以相同。
最简单的方法是对范围内的所有数对进行按位与,然后找到其中最大的值。这种方法时间复杂度为O(N^2),很明显在范围较大时会超时。代码如下:
def max_bitwise_and(x, y):
res = 0
for i in range(x, y+1):
for j in range(i, y+1):
res = max(res, i & j)
return res
由于按位与操作是从高到低依次处理,所以在按位与之后,如果结果位上的某一位为0,那么这一位的值就不可能再被改变。因此对于范围内的数对,我们只关心它们二进制下的前缀相同的位数,然后将这个前缀和后缀的组合再加起来就是答案。代码如下:
def max_bitwise_and(x, y):
res = 0
diff = y - x
while diff > 0:
diff >>= 1
res += 1
return (x & y) >> res << res
时间复杂度为O(log(MAX(x, y))),其中MAX(x, y)为x和y中的最大值。