給一個範圍 [m, n] where 0 <= m <= n <= 2147483647,回傳範圍內所有(整數)的 位元且 結果。
說位元計算是我很少碰到的一塊,不熟悉。
設想一個攤開的情形,答案會是最高位起的連續相同部分取 1, 剩下取 0。
1111011
1100000
11xxxxx => x都會出現0
正因為這是二進位,所以 m, n 之間的數字會使得在最高位連續相同的部分之後的各位置都會有 0 的出現。
因此將著重在如何得到目標部分。
如果 m, n 不相同,m, n往右移一位,直到最高位連續相同的部分時,m == n (※這二者不斷位移後的情形)
由於 m, n 都被動過,到這裡要向左移還原剛右移的部分,因此在剛右移的部分加一變數記錄次數。
class Solution:
def rangeBitwiseAnd(self, m: int, n: int) -> int:
i = 0
while m != n:
m >>= 1
n >>= 1
i += 1
return m << i
C#
public class Solution {
public int RangeBitwiseAnd(int m, int n) {
int times = 0;
while(m != n)
{
m >>= 1;
n >>= 1;
times++;
}
return m << times;
}
}