码迷,mamicode.com
首页 > 其他好文 > 详细

201 Bitwise AND of Numbers Range

时间:2015-04-24 16:27:56      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:与求和   leetcode   

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,有效位为三位。




201 Bitwise AND of Numbers Range

标签:与求和   leetcode   

原文地址:http://blog.csdn.net/linux_liulu/article/details/45243721

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!