ビットおよび(ビット操作/思考)による数値範囲

タイトル:https : //leetcode-cn.com/problems/bitwise-and-of-numbers-range/
指定された範囲[m、n]、ここで0 <= m <= n <= 2147483647、すべて返す数値のビットごとのAND(mとnのエンドポイントを含む)。
アイデア:直感的な解決策は、(n、m)のさまざまなステータス部分を0に変更することで、少しずつ右に移動してから左に戻すことができます。この方法は非常に高速です。
そして、次のように、ツリー配列の下位ビットを使用する別の方法があります。

class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
        while(n > m) n &= (n-1);
        return n;
    }
};

より速いアプローチ

class Solution {
    public int rangeBitwiseAnd(int m, int n) {
        return n & ~(allOneAfterhighestBit(m^n));
    }
    int allOneAfterhighestBit(int i) {
        i|=i>>1;         // 1xxxxx...最高位复制了一个1到后面 =>11xxxxx... 有2个1
        i|=i>>2;         // 11xxxx...复制了2位1 => 1111xxxx... 有4个1
        i|=i>>4;         // 1111xxxx...复制了4个1 =>11111111xxx... 有8个1
        i|=i>>8;         // 11111111xxx... 复制了8个1 => 1111111111111111xxx... 有16个1
        i|=i>>16;        // 1111111111111111xxx... 复制了16个1 => 11111111...1111 有32个1
        // 如果i最高位不足8或者16等,操作相当于|0,不变,所以此时的i变成了最高位后全是1x
        return i;
    }

}
元の記事を152件公開 賞賛2 訪問6450

おすすめ

転載: blog.csdn.net/weixin_43918473/article/details/104918385