数字范围按位与
给你两个整数 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
};