JAVA程序设计:数字范围按位与(LeetCode:201)

给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。

示例 1: 

输入: [5,7]
输出: 4
示例 2:

输入: [0,1]

思路:规律题,可以在纸上随便写几个连续的数的二进制表示,这样就能发现其实每一位的连续1的数量都是有规律的,比如最低位连续1的个数是1个,然后倒数第二位是2个,倒数第3位是4个.........

class Solution {
    public int rangeBitwiseAnd(int m, int n) {
        if(m==0) return 0;
        
        int dis=n-m+1;
        if(dis<=1) return n;
        
        int sum=1,num=0,ans=0;
        for(int i=0;i<32;i++)
        {
        	if(sum>=dis)
        		break;
        	sum*=2;
        	num++;
        }
        for(int i=num;i<32;i++)
        	if(((m>>i)&1)==1 && ((n>>i)&1)==1)
        		ans+=(1<

 

你可能感兴趣的:(JAVA程序设计:数字范围按位与(LeetCode:201))