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)
{
int i, mbit, match, val;
match = val = i = 0;
mbit = -1; // 最高有效位初始化不能为0
if ( (m < 0) || (n > 2147483647) || (m > n))
return 0;
for (i = 30; i >= 0; i--) // 得到n的最高有效位
{
if (n & (0x01 << i)) // n在该位为1
{
mbit = i;
break;
}
}
if (mbit != -1) // 至少有一位有效位
{
for (i = mbit; i >= 0; i--) // 从最高位开始,m、n连续高位相等的个数
{
if ( (n & (0x01 <<i)) == (m & (0x01<< i)) )
match++;
else
break;
}
for (i = 0; i < match; i++) // 获得每一个匹配位的值
{
val = val | (n & (0x01 << mbit--) );
}
return val;
}
else
return 0;
}
Submission Details
8266 / 8266 test cases passed.
| Status: Accepted |
Runtime:
45 ms
|
Submitted:
6 minutes ago
|
题目介绍:
将m到n之间的所有的数相与,得到其结果
要点:最笨的方法是将所有的数真正的相与,这无疑耗时效率低下。通过分析可以发现,若两个数最高有效位长度不相等,则最终结果一定是
仅含n的最高有效位的值,eg. m = 0x1kkk, n = 0x1kkk kkkk,k代表0或1,最终m到n所有数相与的结果为0x10000 0000;若两个数最高有效
位长度相等,则从高位依次比较其相等的位,直到不相等为止,相等的位保留,不相等的位置为0,则为与之后的结果,eg. m = 0x1010 0100,
n = 0x1010 1111,则m到n之间的所有数相与之后的结果为0x1010 0000;
陷阱:
1. 注意到最高有效位初始化时不能为0,因为>=0 都是有效值。
2. 求匹配位长度之前,需要判断mbit是否为-1,否则之后的 i = mbit;语句会带来for循环中可能错误执行一次(本程序中已排除)。
3. 从最高有效位开始匹配,不仅仅针对1,eg. 1010与1011,有效位为三位。