【LeetCode-201】Bitwise AND of Numbers Range

当看到这道题时,自己用了笨方法,每个相与,很显然最后没被accept,看到了别人的好的代码,记录一下吧。

java代码如下:

/**
 * 按位运算,所有数字自然要按二进制形式表达。一组数字按位与时,只有所有数字这一位上都为1时,结果才会为1。如果m=n,那自然结果就是m.下面讨论m!=n的情况。
 * 让我们从最低位开始。
 * 如果这一组数字的最低位不相同的话,那这一位就肯定会被消掉,变成0.如果m!=n,那最低位肯定是要被消掉的,因为最低位肯定会是一个0,一个1.这时,我们可以将m和n都右移一位,将最后一位忽略。
 * 此时,又有了新的一组m和n。如果此时m=n,那结果就是m了。如果不是的话,那可以继续上一段的过程,将m和n右移一位。
 * 重复上述操作,直到m=n。这个时候,从低位往高位所有进行与操作后结果为0的位数都已经被消掉,而高位的数字进行与操作不会发生变化,此时的m或者n再向左移动之前移动的位数,得到的就是这一组数字按位与后的结果。
 * @author MG
 *
 */

public class BitwiseANDofNumbersRange {
	public int rangeBitwiseAnd(int m, int n) {
        int count = 0;
        while(m != n){
        	m = m >> 1;
        	n = n >> 1;
        	count ++;
        }
        
        return m << count;
    }
}
public int rangeBitwiseAndBetter(int m, int n) {
		//每次消除n的最后一位1
        while(n > m){
            n = n & (n-1);
        }
        return n;
    }

后面一种代码更加简单!

转自:http://www.cnblogs.com/csonezp/p/4587392.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值