201. Bitwise AND of Numbers Range

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     }
复制代码

 

posted @   daniel456  阅读(101)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示