<LeetCode OJ> 201. Bitwise AND of Numbers Range

题目翻译:

0 <= m <= n <= 2147483647,求取m到n之间所有数字相与运算的结果。


分析:DONE

笨办法,直接相与,显然容易超时。

class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
        int result=0xffff;
        for(int i=m;i<=n;i++)
            result&=i;
        return result;    
    }
};



m到n之间的数的低位只要不相同,相与就是0,所有数的高位(通过位移实现)相同即可得到结果,但是高位不相同直接就是0。
比如【5,6,7】 二进制表示分别为:、

    101

    110

& 111

显然三数只有第一列是相同的,所以结果显然是100

又比如【1,2,3,4】 二进制表示分别为:

    001

    010

    011

& 100

显然所有同一列的位均不相同,结果为0.

那么怎么得到哪些列的1位是相同的?右移运算!所有数同时右移运算后的结果相同,此时就是答案,但是如果谁先被移位为0,显然结果就是0。

通过别人的提示发现,实际m到n之间的所有数相与,只需这m,n两个数计算即可(因为m和n是最难保持一致,如果他们都通过移位保持一致了,那么中间那些数一定也可以保持一致)。

位运算解法,代码如下:

class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
        if(m==0 || n==0)
            return 0;
        int offset=0;
        while(m!=0 && m!=n)//较小者一旦变为0,结果一定是0
        {
            m>>=1;//往右移1位,并且将结果赋值给m
            n>>=1;
            offset++;//统计移位数目
        }
        return m<<offset;//移回去
    }
};


注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!

原文地址:http://blog.csdn.net/ebowtang/article/details/51644688

原作者博客:http://blog.csdn.net/ebowtang

本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值