问题描述:判断一个整数 n 是否为 2 的幂次方

一、2的幂次方的基本定义

什么样的数为2的幂次方?例如2^0=1,2^1=2,2^2=4……,符合公式2^n(n>=0)的数称为2的幂次方。

如何判断一个数是否为2的幂次方呢?基本思路:把一个数不断的除以2,得到商与余数,若余数等于1,则这个数必然不是;若余数大于1,则继续除以2,直到商等于1。若商等于1且余数为0,则这个数为2的幂次方。

二、2的幂次方的判断方法

1:把一个数不断的除以2,得到商与余数,若余数等于1,则这个数必然不是;若余数大于1,则继续除以2,直到商等于1。若商等于1且余数为0,则这个数为2的幂次方。代码如下: 1 /// <summary>

 1         /// <summary>
 2         /// 判断一个整数 n 是否为 2 的幂次方
 3         /// </summary>
 4         /// <param name="n">需要判断的整数n</param>
 5         /// <returns>true:整数n是2的幂次方;false:整数n不是2的幂次方</returns>
 6         static bool IsPower(int n)
 7         {
 8             while (true)
 9             {
10                 //0是2^0
11                 if (n == 0) return true;
12 
13                 int quotient = n / 2;//
14                 int remainder = n % 2;//余数
15 
16                 //余数等于1,则这个数必然不是
17                 if (remainder == 1) return false;
18 
19                 //商等于1且余数等于0,则这个数必然是
20                 if (quotient == 1 && remainder == 0) return true;
21 
22                 n = n / 2;
23             }
24         }

2: 把一个数n拆成二进制看待处理的,如果 n 是 2 的幂次方的话,那么 n 的二进制数的最高位是 1,后面的都是 0。如果我们把它减 1,则会导致最高位变成 0,其余全部变成 1。然后我们把 n 和 (n - 1)进行与操作,结果就会是 0。例如:16=1 0000,(1 0000 & 0 1111)=0。代码如下:

1         /// <summary>
2         /// 判断一个整数 n 是否为 2 的幂次方
3         /// </summary>
4         /// <param name="n">需要判断的整数n</param>
5         /// <returns>true:整数n是2的幂次方;false:整数n不是2的幂次方</returns>
6         static bool IsPower(int n)
7         {
8             return (n & (n - 1)) ==0;
9         }

 三、总结

从运算性能上来说,首选n & (n - 1)的判断方式,一行代码即可解决2的幂次方的判断。

原文地址:https://www.cnblogs.com/dongweian/p/12513582.html