思路
現在的右邊界是 right,跟 right - 1& 之後,right的最後一個 1 就會被捨棄。
找到 right最右邊的 1 所在的位置。
然後減去這個數值,就能將無法活下來的位數給抹掉。
rightright &(−right)010100010000000000010000010100000000−
只有前面的 1 才有機會活下來,最後一個 1 已經沒有機會了。
重複操作直到 left≥right,也就是讓 right無法再往下減。
程式碼
位運算
class Solution {
public:
int rangeBitwiseAnd(int left, int right) {
while(left < right) {
right -= right & -right;
}
return right;
}
};
複雜度分析
- 時間複雜度:O(logn)
- 空間複雜度:O(1)