一. 题目描述
Given a range [m, n]
where 0 <= m <= n <= 2147483647
, return the bitwise AND of all numbers in this range, inclusive.
For example, given the range [5, 7]
, you should return 4
.
二. 题目分析
给定一个范围[m, n]
,其中 0 <= m <= n <= 2147483647
,返回范围内所有整数的按位与,包括边界m
和n
。比如给定范围为[5, 7]
, 应返回4
。
单看题目描述,可以知道该题涉及到位运算,因此需动笔分析:
对于题目给定的范围[5, 7],可写为:
5: 101
6: 110 -> 100 -> 4
7: 111
再来两个例子:
范围[6, 8]:
6: 0110
7: 0111 -> 0000 -> 0
8: 1000
范围[8, 10]:
8: 1000
9: 1001 -> 1000 -> 4
10: 1010
现在可以总结出规律了,对于范围[m, n]
,若n
的最高有效位比m
的最高有效位要高,则必然会出现像例子出现的情况,必然在范围内存在两个数,这两个数分别是对方的反码:
6: 0110
7: 0111 -> 0000 -> 0
8: 1000
因此,只有当m
和n
的最高有效位一致时,即m与n同时右移n位,且m == n,m == 1
时按位与结果不为0,且该结果为m
与n
的公共左边首部,以下给出简单的代码:
三. 示例代码
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
int bits = 0;
while (m != n)
{
m >>= 1;
n >>= 1;
++bits;
}
return m << bits;
}
};
四. 小结
该题是数学问题,用位运算即可快速解决,主要是要找出规律。
leetcode笔记:Bitwise AND of Numbers Range
原文:http://blog.csdn.net/liyuefeilong/article/details/50804632