1 class Solution: 2 def rangeBitwiseAnd(self, m: int, n: int) -> int: 3 while n > m: 4 n &= (n-1) 5 return n
算法思路:位运算。
“按位与”操作有一个特点,就是 n & (n-1),是将n的最低的一位二进制1变成0。
例如:
10:1010
9:1001
10 & 9 = 1000 -> 8
注意这是最低位的1变成0,而不是 n - 2。
例如:
100 & 99 = 96 而不是98。但是与的结果必定是小于 n的。
根据按位与的这个特点,可以知道在闭区间[m,n]上,本题实际上是计算:
n将最低位的1变成0,如果还大于m,则继续将最低位变成0,一直到比m小,则为所求答案。