原题
Given an integer, write a function to determine if it is a power of two.
题目分析
最直接的方法利用幂和对数是一对互逆操作,对输入的数求对数,如果结果为整数,则为true
,否则为false
。
这个题按照这样分析是非常简单的,但是如此计算,隐藏如下几个陷阱:
1. 如果输入为0
,返回false
,这种情况要考虑到。
2. 如果输入为负数,如-16,很明显不存在2的几次幂等-16。
代码分析
直接求对数
if (n == 0) return false; //考虑0
double d = Math.Log(n, 2);
if (double.IsNaN(d))//考虑-16这种情况
return false;
//注意小于1e-10
return Math.Abs(Convert.ToInt32(d) - d) < 1e-10 ? true : false;
取余法
如果不大于0,则返回false;
当n大于1时,n对2取余,若大于0,返回false,n减半更新,重复以上检查,所有检查都没有出现余数,则返回true。
public bool IsPowerOfTwo(int n)
{
if (n<=0) return false;
while (n>1)
{
if (n % 2 > 0) return false;
n /= 2;
}
return true;
}