【力扣-中等】201. 数字范围按位与

给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。

示例 1:
输入: [5,7]
输出: 4
示例 2:
输入: [0,1]
输出: 0

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bitwise-and-of-numbers-range

【解答】

my

 public int rangeBitwiseAnd(int m, int n) {
if (m == 0 || n == 0) {
            return 0;
        }
        if (m == n) {
            return m;
        }
        int log = (int)Math.floor(Math.log(m)/Math.log(2))+1;
        if(n>=Math.pow(2,log)){
            return 0;
        }
        int res = m;
        for (int i = m + 1; i <= n; i++) {
            res &= i;
            if (i == Integer.MAX_VALUE){
                break;
            }
        }
        return res;
    }
【位移】

官方:所有数字按位与运算的结果是所有对应二进制字符串的公共前缀再用零补上后面的剩余位
证明:假设对于[m,n]所有二进制串,前 i 位均相同,第 i+1 位开始不同;
由于 [m,n] 连续,所以从小到大的所有二进制串在第i+1位上列举出来一定是前面部分更小的数字是 0,后面部分是 1,所有二进制串按位与的结果一定为 0;
因此第 i+1 位开始的剩余位均为 0,前 i 位由于均相同,因此按位与结果不变。

进一步来说,[m,n]所有二进制字符串的公共前缀就是起始m和结束 n 的公共前缀
Brian Kernighan算法:清除二进制串中最右边的 1(一种右移),n = n & (n - 1)

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/bitwise-and-of-numbers-range/solution/shu-zi-fan-wei-an-wei-yu-by-leetcode-solution/

public int rangeBitwiseAnd(int m, int n) {
	if (m == 0 || n == 0) {
            return 0;
        }
        if (m == n) {
            return m;
        }
    while (m<n) {
        n &= (n-1);
        }
        return n;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值