[LeetCode] 201. Bitwise AND of Numbers Range

题意是给一个范围[m, n],输出这个范围内所有二进制数做AND操作之后的结果。思路是位运算。举个例子,如下是四个连续的数字,

0100010

0100011

0100100

0100101

注意,当他们被AND的时候,会发现最低位会变成0。因为两个相邻的数字的最低位一定不一样,所以AND之后的结果只会是0。这样不停地AND之后(同时向右移,假设最后右移了X次好了),到这一步发现前面若干位都是一样的时候,就可以停止了。最后将m向左移动X次,就会得到最后的结果。

0100xxx

0100xxx

0100xxx

0100xxx

JavaScript实现

 1 /**
 2  * @param {number} m
 3  * @param {number} n
 4  * @return {number}
 5  */
 6 var rangeBitwiseAnd = function(m, n) {
 7     let offset = 0;
 8     while (m !== n) {
 9         m >>= 1;
10         n >>= 1;
11         offset++;
12     }
13     return m << offset;
14 };

 

Java实现

 1 class Solution {
 2     public int rangeBitwiseAnd(int m, int n) {
 3         int offset = 0;
 4         while (m != n) {
 5             m >>= 1;
 6             n >>= 1;
 7             offset++;
 8         }
 9         return m << offset;
10     }
11 }

 

你可能感兴趣的:([LeetCode] 201. Bitwise AND of Numbers Range)