タイトル: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;
}
}