题目来源https://www.jianshu.com/p/16f031195796
题目:给定数字n,找到下一个2的幂,如果n本身是2的幂,则返回n
方法:因为是将n转化为2的n次幂,需要从二进制角度来看待问题。
例如:5 = 0101, 9 = 1001,
对于5来说要找到的是8 = 1000, 9来说要找到的是16 10000
结果都可以看做是由1左移位得到的,
这个想法是将传入参数不断的和左移位的数字做比较,如果存在相等的情况则直接返回,否则当循环跳出的时候得到的左移位数字就是所需要的传入参数的下一个2的幂;
比如传入参数为9,
置初始数字为1,当9大于等于1时,左移位的数字开始移位,第一次左移后为二进制10,即为4,判断9不等于4,下一轮循环移位,9大于等于二进制100,判断9不等于8,继续移位判断9不等于8,下一轮循环移位,此时9已经小于二进制1000,判断9不等于16后跳出循环,此时的16即是我们需要的返回值。
比如传入参数为8,
置初始数字为1,当8大于等于1时,左移位的数字开始移位,第一次左移后为二进制10,即为4,判断8不等于4,下一轮循环移位,8大于等于二进制100,判断8等于8,返回结果8
实现代码如下:
public int findNextSquareOf2(int num){
int leftRemove = 1;
while (num >= leftRemove) {
leftRemove <<= 1;
if(num == leftRemove){
return num;
}
}
return leftRemove;
}