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