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

📅  最后修改于: 2023-12-03 14:56:55.195000             🧑  作者: Mango

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

问题描述

给定两个整数 X 和 Y ,找到大于等于 X 且小于等于 Y 的整数对 (i, j),使得按位与运算 (i AND j) 的结果最大,同时 i 和 j 可以相同。

解决方法

观察题目中的例子,我们发现当 X 和 Y 在二进制下的最高位数字不同时,它们之间的所有数字在最高位数以下的所有数字的按位与结果必然为 0,因为按位与运算是逐位进行的,只要有一位为 0 就为 0。

举例:当 X = 8 (1000) ,Y = 15 (1111) 时,它们之间的所有数字在最高位数以下的所有数字的按位与结果必然为 0。

因此,我们只需要找到 X 和 Y 在二进制下的最高位数字相同的那个数,然后将这个数字的剩下位数全部填为 1,即可得到最终结果。

举例:当 X = 10 (1010) ,Y = 12 (1100) 时,它们在二进制下的最高位数字相同为 1,因此把剩下的位数全部填为 1,得到结果为 1111。

根据上述思路,我们可以设计以下的算法:

def rangeBitwiseAnd(X, Y):
    count = 0
    while X != Y:
        X >>= 1
        Y >>= 1
        count += 1
    return X << count

该算法的时间复杂度为 O(log n) ,其中 n 是 X 和 Y 中的最大位数。

总结

本题是一道比较简单的位运算题目,主要考察对位运算的理解和二进制运算的技巧。我们只需要找到 X 和 Y 在二进制下的最高位数字相同的那个数,然后将这个数字的剩下位数全部填为 1,即可得到最终结果。