创见博客
数字范围按位与
七崽爱吃小饼干2026/01/20阅读 0专栏 算法合集

数字范围按位与

给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)。

示例 1:

codeType
输入:left = 5, right = 7
输出:4

示例 2:

codeType
输入:left = 0, right = 0
输出:0

示例 3:

codeType
输入:left = 1, right = 2147483647
输出:0

提示:

  • 0 <= left <= right <= 231 - 1

解法

解法一

这种解法在碰到区间大,且某一位为1的时候,就会超时

ts
function rangeBitwiseAnd(left: number, right: number): number {
    // 某一位进行与操作,只要有一个数字是0,那么该位就是0
    // 所以可以逐位进行计算,该位的数字只要有一个是0就直接将该位置0即可
    let res = 0
    for(let i = 0; i < 32; i++){
        let isZero = false
        for(let j = left; j <= right; j++){
            // 获取待检查的数字
            let num = (j >>> i) & 1 // i = 0 就是取最右边一位
            if(num === 0){
                isZero = true
                break
            }
        }
        if(!isZero){
            // 这一位全是1,那么答案的对应位置置1
            res |= (1 << i)
        }
    }
    return res
};
解法二
ts
function rangeBitwiseAnd(left: number, right: number): number {
    // 只要有left < right
    // 那么区间肯定存在num = left + 1
    // 那么这两个数字的最后一位相与一定为0
    // 所以只需要让left和right逐个右移,比较大小即可
    let zeroNum = 0 // 最低位0的个数
    for(let i = 0; i < 32; i++){
        if(left === right) break
        zeroNum++ 
        // 逐个右移检查
        left >>= 1
        right >>= 1
    }
    // left的最后zeroNum位置零
    return left << zeroNum
};
评论
0/100