LeetCode 201. 数字范围按位与

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

示例 1: 

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

输入: [0,1]
输出: 0

链接:

1. 直接比较起始端点和终止端点的公共长度
2. 因为公共的部分才可以保证相与之后不变化,非公共部分相与之后一定为0,因为之所以是非公共部分就说明不同,而二进制中只有0和1,因此说明非公共部分的每一位既出现了0也出现了1,则相与一定为0
class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
        // 1 = 001
        // 2 = 010
        // 3 = 011
        // 5 = 101
        // 7 = 111
        string bitm = "", bitn = "";
        while(m){
            bitm += char('0' + (m & 1));
            m = m >> 1;
        }
        while(n){
            bitn += char('0' + (n & 1));
            n = n >> 1;
        }
        while(bitm.size() < bitn.size())
            bitm += '0';

        reverse(bitm.begin(), bitm.end());
        reverse(bitn.begin(), bitn.end());

        vector ans;
        for (int i = 0; i < bitm.size(); ++i){
            if (bitm[i] == bitn[i]){
                ans.push_back(bitn[i] - '0');
            }else{
                break;
            }
        }

        for (int i = ans.size(); i < bitn.size(); ++i){
            ans.push_back(0);
        }

        reverse(ans.begin(), ans.end());

        int res = 0;
        for (int i = 0; i < ans.size(); ++i){
            res = res + ans[i] * pow(2,i); 
        }

        return res;
        
    }
};
class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
        int t = 0;
        while(m < n){
            m = m >> 1;
            n = n >> 1;
            t ++;
        }
        return m << t;
    }
};

 

你可能感兴趣的:(Leetcode)