# 【LeetCode】 201. Bitwise AND of Numbers Range ## Description > Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive. > 給一個範圍[m, n]且 0 <= m <= n <= 2147483647,回傳對所有該範圍的數字做位元運算AND的結果,範圍包含邊界。 ## Example: ``` Example 1: Input: [5,7] Output: 4 Example 2: Input: [0,1] Output: 0 ``` ## Solution * 我們先很直覺的把題目要做的事情打出來: ```C++=1 class Solution { public: int rangeBitwiseAnd(int m, int n) { int ans = m; for(int i = m + 1; i <= n; i++) ans = ans & i; return ans; } }; ``` * 按下送出後我們發現在測資`0 2147483647`吃了TLE,原因也很明顯,因為其實看到`0`就知道結果為`0`,卻做了多餘的運算,導致時間太久。 * 因此讓我們觀察一下如何加速:以`4~7`為例子 ![](https://i.imgur.com/W1wFeJ7.png) * 可以發現,我們只要看頭尾就可以分析出答案。怎麼看呢? * 連續的數字,它一定從最小位元開始變,變過第一位就變第二位......因此如果它最小位元一樣,代表他前一位也要是一樣的。 ![](https://i.imgur.com/lWi0ssI.png) * 也就是說我們只需要從最大位元開始檢查,頭尾是否一樣: * 如果一樣,就將該位元放入答案。 * 如果不一樣,輸出答案。 * 最後的問題是如何取出想要的位元呢?很簡單,使用位移`<<`即可。 * 如果要取`m`的第`3`位,那就`m & (1 << 2)`就好了。 ### Code ```C++=1 class Solution { public: int rangeBitwiseAnd(int m, int n) { int ans = 0; for(int i = 31; i >= 0 ; i--) { if((m & (1 << i)) == (n & (1 << i))) ans += (m & (1 << i)); else break; } return ans; } }; ``` ###### tags: `LeetCode` `C++`