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