码迷,mamicode.com
首页 > 其他好文 > 详细

201. Bitwise AND of Numbers Range

时间:2017-10-25 13:07:12      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:sea   .com   含义   example   过程   span   div   最大   代码   

Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.

For example, given the range [5, 7], you should return 4.

含义:给一个范围,返回这个范围中所有的数按位相与最后的结果。

思路:

考虑数据的二进制形式。

对于整数mn,在数值连续变化的过程中,它们的某些高位比特是相同的,而只有低位的比特连续变化。

例如:

整数:33,34,35,36

它们的二进制形式是(为了简单,我们假设每个数值有8个bits):

33 : 00100001
34 : 00100010
35 : 00100011
36 : 00100100

不难看出,它们都具有00100xxx的形式,共同的高位比特是:00100。如果进行按位与运算(&)的话,这些高位是保持不变的。

再看低位(低3位比特)。与运算之后的结果是000


由上面的分析,可以得到:

为了得到它们与运算的结果,我们只需要找出区间[m, n]范围内所有数值的共同高比特位即可。

又因为mn是这些数中相差最大的,所以它俩拥有的共同高位比特也是最少的。

所以计算中只需要用mn即可。

代码如下:

 1     public int rangeBitwiseAnd(int m, int n) {
 2 //        http://www.jianshu.com/p/ea0f6aa14ef4
 3 //        对于整数m到n,在数值连续变化的过程中,它们的某些高位比特是相同的,而只有低位的比特连续变化。
 4 //        整数:33,34,35,36  共同的高位比特是:00100。进行按位与运算(&)的话,高位是保持不变的。低3位比特与运算之后的结果是000
 5 //        为了得到它们与运算的结果,我们只需要找出区间[m, n]范围内所有数值的共同高比特位即可。
 6         int offset = 0;
 7         while (m != n)  // 找出m、n的共同高位比特。
 8         {
 9             m >>= 1;
10             n >>= 1;
11             offset++;
12         }
13         return m << offset;        
14     }

 

201. Bitwise AND of Numbers Range

标签:sea   .com   含义   example   过程   span   div   最大   代码   

原文地址:http://www.cnblogs.com/wzj4858/p/7727920.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!