题目:
难度:Middle
相关话题:位运算
给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
示例 1:
示例 2:
思路:
因为n
和m
最多31
位,因此从左到右遍历它们每一个位置(31次),按位与的规则是从m到n的每一个数的当前位置必须都是1
,这个位置最后结果才能是1
。
如果当前位置m
和n
相等并且为1
,最终结果此位置一定为1
;
如果当前位置m
和n
相等并且为0
,最红结果此位置一定为0
;
如果当前位置m
和n
不相等,那么不需要再遍历了,后面的位置都是0
。
因为大的数n
此位置一定为1
,m
这个位置一定是0
(n>=m),从m
到n
的过程中,这个位置进位了,一旦发生进位,前面的每一位都要经过一次0
,因此前面全部为0
。
最后将结果解析为数字。
/**
* @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
* @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
* @param {number} m
* @param {number} n
* @return {number}
*/
var rangeBitwiseAnd = function(m, n) {
let k=Math.pow(2,30)
let str=''
for(let i=0;i<31;i++){
let c1=(m<<i) & k,
c2=(n<<i) & k
if(c1!==c2){
return parseInt(str.padEnd(31,0),2)
}else{
if(c1===0)str+='0'
else str+="1"
}
}
return parseInt(str,2)
};
扩展阅读: