问题描述:判断一个整数 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的幂次方的判断。