[LeetCode] Bitwise AND of Numbers Range

203 篇文章 0 订阅

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.

解题思路:

这道题的意思是,计算从m到n的非负整数的按位与值。太牛逼了,我想了好久都是计算超时。结果其实就是m和n公共头部。例子中5的二进制为101,7的二进制位111,其公共头部为100。再如,若计算3到5的按位或,3的二进制位11,5的二进制位101,没有公共头部,返回0。

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

这是一类非常有意思的题目。我在网上还看到了,计算[m, n]的非负整数的 按位异或。一种解法非常巧妙:

long long f(long long a) {
     long long res[] = {a,1,a+1,0};
     return res[a%4];
}

long long getXor(long long a, long long b) {
     return f(b)^f(a-1);
}

为什么这个代码能够工作呢?让我们先看看4位二进制的从0到a的按位异或。

0000 <- 0  [a]
0001 <- 1  [1]
0010 <- 3  [a+1]
0011 <- 0  [0]
0100 <- 4  [a]
0101 <- 1  [1]
0110 <- 7  [a+1]
0111 <- 0  [0]
1000 <- 8  [a]
1001 <- 1  [1]
1010 <- 11 [a+1]
1011 <- 0  [0]
1100 <- 12 [a]
1101 <- 1  [1]
1110 <- 15 [a+1]
1111 <- 0  [0]
上述代码中,我们看到,f函数其实就是返回[0, a]的按位异或。对于主体函数,f(b)表示从[0, b]的异或,f(a-1)表示[0, a-1]的异或,f(b)^f(a-1)则等于[a, b]的异或。因为任何数异或自身都为0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值