zoukankan      html  css  js  c++  java
  • [LeetCode] 201. Bitwise AND of Numbers Range ☆☆☆(数字范围按位与)

    https://leetcode.com/problems/bitwise-and-of-numbers-range/discuss/56729/Bit-operation-solution(JAVA)

    面试官,你再问我 Bit Operation 试试?

    描述

    Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.

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

    如:

    输入: [26,30]
    输出: 24

    解析

    首先,将 [ 26 , 30 ] 的范围数字用二进制表示出来:

    11010  11011  11100  11101  11110

    而输出 24 的二进制是 11000 。

    可以发现,只要找到二进制的 左边公共部分 即可。

    所以,可以每次向左移一位,比较 m 和 n 是否相同,不同再继续左移一位,直至相同,然后相同的数再左移对应位数即可。

    代码

    public int rangeBitwiseAnd(int m, int n) {
       int i = 0; // i means we have how many bits are 0 on the right
       while(m != n) {
         m >>= 1;
         n >>= 1;
         i++;  
       }  
       return m << i;  
    }

    另一种:

    可以先建立一个 32 位都是 1 的 mask,然后每次向左移一位,比较 m 和 n 是否相同,不同再继续左移一位,直至相同,然后把 m 和 mask 相与就是最终结果。

    public int rangeBitwiseAnd(int m, int n) {
            int d = Integer.MAX_VALUE;
            while ((m & d) != (n & d)) {
                d <<= 1;
            }
            return m & d;
        }
  • 相关阅读:
    Nginx
    Influxdb
    Gitlab
    Git
    Gogs
    Dockerfile
    Docker Data
    My Projects
    中文学习
    科技精选
  • 原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/10696587.html
Copyright © 2011-2022 走看看