📌  相关文章
📜  给定范围内的最大按位与对(X,Y),使得X和Y可以相同(1)

📅  最后修改于: 2023-12-03 15:27:36             🧑  作者: Mango

给定范围内的最大按位与对(X,Y),使得X和Y可以相同

给定一个正整数范围[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中的最大值。