Bitwise AND of Numbers Range

25 篇文章 0 订阅

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.

给定两个数m和n,返回m和n之间所有的数字相与后的结果

1.从m到n顺序相与

class Solution 
{
public:
    int rangeBitwiseAnd(int m, int n) 
    {
        if(m==n)
        return m;
        int result=m;
        for(int i=m+1;i<=n;i++)
            result&=i;
        return result;
    }
};
当m与n之间差值比较大的时候,会超时

2.找规律

class Solution 
{
public:
    int rangeBitwiseAnd(int m, int n) 
    {
        if(m==n)
        return m;
        int diff=n-m;
        int result=0;
        int mask=1<<1;
        int it=1;
        while((mask<=m)&&it<31)
        {
            int flag=m&mask;
            int res=m&(mask-1);
            if(flag&&((res+diff)<=(mask-1)))
                result+=mask;
                mask=mask<<1;
            it++;
        }
        return result;
    }
};
当m的对应位为0的时候,那么相与后该位置一定为0,当m中的对应位为1的时候,此时需要判断此位后面的其余二进制位加上m与n之间的差值会不会

向此位产生进位,若会产生进位那么此时该位相与后的结果也为0,反之此位为1

3.【转】

按位运算,所有数字自然要按二进制形式表达。一组数字按位与时,只有所有数字这一位上都为1时,结果才会为1。如果m=n,那自然结果就是m.下面讨论m!=n的情况。

让我们从最低位开始。
如果这一组数字的最低位不相同的话,那这一位就肯定会被消掉,变成0.如果m!=n,那最低位肯定是要被消掉的,因为最低位肯定会是一个0,一个1.这时,我们可以将m和n都右移一位,将最后一位忽略。

此时,又有了新的一组m和n。如果此时m=n,那结果就是m了。如果不是的话,那可以继续上一段的过程,将m和n右移一位。

重复上述操作,直到m=n。这个时候,从低位往高位所有进行与操作后结果为0的位数都已经被消掉,而高位的数字进行与操作不会发生变化,此时的m或者n再向左移动之前移动的位数,得到的就是这一组数字按位与后的结果。

public int rangeBitwiseAnd(int m, int n) {
    int i=0;
    while(m!=n){
        m>>=1;
        n>>=1;
        i++;
    }
    return m<<i;
    }
}



4.

public class Solution {
    public int rangeBitwiseAnd(int m, int n) {
        while(n>m){
            n=n&(n-1);
        }
        return n;
    }
}
将m与n之间相与的过程看做n&(n-1)....&m

而n&(n-1)的结果是将n中从右向左第一个为1变为0,假设n中从右向左中第一个1在第k位,那么n-1为第k位为0后面全为1的数,依次类推n-2,..,当后面k-1位中仍存在1时,它们对n&(n-1)相与的结果不产生任何影响,当后面k位全为0时,即为n&(n-1)时,如果再向下就为n&(n-1)-1此时在相与就会产生影响

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值