实现一个方法,来判断一个正整数是否是 2 的整数次幂(如 16 是 2 的 4 次方,返回 true;18 不是 2 的整数次幂,则返回 false)。要求性能尽可能高。

image.png

小灰的具体想法如下。

创建一个中间变量 temp,初始值是 1。然后进入一个循环,每次循环都让 temp 和目标整数相比较,如果相等,则说明目标整数是 2 的整数次幂;如果不相等,则让 temp 增大 1 倍,继续循环并进行比较。当 temp 的值大于目标整数时,说明目标整数不是 2 的整数次幂。

  1. function isPowerOf2(int num) {
  2. int temp = 1;
  3. while(temp<=num){
  4. if(temp == num){
  5. return true;
  6. }
  7. temp = temp*2;
  8. }
  9. return false;
  10. }

image.png
2的整数幂(2、4、8、16),他们的二进制第一位是1,其他位都是0,所以向左移一位(右边用0填充),相当于乘以2;

  1. function isPowerOf2V2(int num) {
  2. int temp = 1;
  3. while(temp<=num){
  4. if(temp == num){
  5. return true;
  6. }
  7. temp = temp<<1;
  8. }
  9. return false;
  10. }

image.png

最优解

image.png
image.png
image.png
image.png

  1. function isPowerOf2(int num) {
  2. return (num & num - 1) == 0;
  3. }