201 Bitwise AND of Numbers Range

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




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值