其他分享
首页 > 其他分享> > 297,找出不小于x的2的n次方的最小值

297,找出不小于x的2的n次方的最小值

作者:互联网

找出不小于x的2的n次方的最小值

注:这题比较绕,先举个例子,如果x是5,我们就返回8,因为8是大于5且最小的2的幂次方,如果x是9就返回16,因为16是大于9且最小的2的幂次方,如果x是16就返回16,因为16是2的幂次方。同理如果x是33就返回64.

答案:

1public static int highestOneBit(int i) {
2    i--;
3    i |= i >>> 1;
4    i |= i >>> 2;
5    i |= i >>> 4;
6    i |= i >>> 8;
7    i |= i >>> 16;
8    return i + 1;
9}

解析:

这题也很容易理解,因为int类型在java语言中是32位的,这里的或运算相当于把int中左边的1往右边铺开,最终会变成一个左边全部是0,右边全部是1的二进制数,然后再加上1就是我们要查找的值,这里为什么要先减去1,这是因为如果一个数正好是2的幂次方,如果不先减去1,那么最终结果将会放大2倍,举个例子,当i是32的时候,如果不先减去1,最终结果就会是64。我们还可以在换种解法

1public static int highestOneBit(int i) {
2    i |= (i >>  1);
3    i |= (i >>  2);
4    i |= (i >>  4);
5    i |= (i >>  8);
6    i |= (i >> 16);
7    return i - (i >>> 1);
8}

这里刚开始计算的时候没有减去1,但最后会执行i-(i>>>1),结果也都是一样的,比如当i等于32的时候,或运算结束之后i的值是64,当执行i-(i>>>1)的时候,又变为32.

标签:16,int,32,最小值,64,次方,297,减去
来源: https://blog.51cto.com/u_4774266/2902563