201. 数字范围按位与
c++,两种方法
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
// 0和任何东西做与操作都是0,那么意味着只要某一位上面出现了0,那么最后也就是0了,所以就转化为了求公共前缀的问题
// 找公共前缀,对大数不断消去最后的1,直到比小数还小就是公共前缀(做一点点解释,大数与小数的第一位不同必然是大数时1,小数是0,才能保证大数要大一点,我们消去大数的这一位1后,大数必然不会比小数大,此时大数后面全是0,前面是公共前缀,也就找到了我们想要的东西)
// while (n>m){
// n = n&(n-1);
// }
// return n;
// 找公共前缀,不断右移,然后直到两数相同
int num=0;
while (m!=n){
m = m>>1;
n = n>>1;
num +=1;
}
return n<<num ;
}
};
python版
class Solution:
def rangeBitwiseAnd(self, m: int, n: int) -> int:
# 0和任何东西做与操作都是0,那么意味着只要某一位上面出现了0,那么最后也就是0了,所以就转化为了求公共前缀的问题
# 找公共前缀,不断右移,然后直到两数相同
# num=0
# while m!=n:
# m = m>>1
# n = n>>1
# num +=1
# return n<<num
# 找公共前缀,对大数不断消去最后的1,直到比小数还小就是公共前缀(做一点点解释,大数与小数的第一位不同必然是大数时1,小数是0,才能保证大数要大一点,我们消去大数的这一位1后,大数必然不会比小数大,此时大数后面全是0,前面是公共前缀,也就找到了我们想要的东西)
while n>m:
n &= (n-1)
return n