无聊写了一道leetcode,后来翻看discussion发现了一个网友用了一个比较巧妙的方法解题,有助于理解比特位计算的一个特性。
先上代码,后面解析:
题目是:
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.
// 我的解法
int rangeBitwiseAnd(int m, int n) {
if (m == n) return m;
int d = n - m;
int res = 0;
for (int i = 1; res < m; i <<= 1) {
if (d < i) {
res |= i;
}
if (i == 0x40000000) break;
}
return res & m & n;
}
// 网友的解法
int rangeBitwiseAnd(int m, int n)
{
int msb=0;
int t = m ^ n;
while (t >>= 1)
msb++;
unsigned int mask = ~((1 << msb) -1);
return m & mask;
}