题目描述:给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
示例 1:
输入: [5,7] 输出: 4示例 2:
输入: [0,1] 输出: 0
解法1。所有连续数字的与其实本质上找的是其二进制表示左边最长公共部分,最小的是m,最大的是n,那么问题就转化成求m和n最长公共部分,用一个32位全1的mask和两者与看看结果是否相等,相等就找到了,不相等就然mask左移1位
class Solution(object):
def rangeBitwiseAnd(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""
if m == n:
return m
elif m > n:
return
else:
mask = 0xffffffff
while m&mask != n&mask:
mask <<= 1
return m&mask
解法2。上述解法的优化方法,左移一位其实就是舍弃最右边的1,这个操作用n&(n-1)就可以实现,直到小于等于m了就直接返回n
class Solution(object):
def rangeBitwiseAnd(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""
if m == n:
return m
elif m > n:
return
else:
while m<n:
n &= (n-1)
return n