这个问题来源于力扣上面两个新手题
首先是求2的幂,我的思路就是一直除,除到为1为止
所以有以下函数
bool isPowerOfTwo(int n)
{
while(n%2==0&&n>1)
{
n/=2;
}
return n==1;
}
当然我写的原代码必定比这个丑陋,但无所谓我会借鉴答案进行改善,这个方法叫试除法,但其实对于2这个特殊的数,因为计算机是二进制,所以我们知道2的幂在二进制中表示形式就是只有一个1,然后又发现n-1除了原来那一位变为0,后面都变成1,这个时候我们只要让n和n-1按位与,如果他是二的幂,那么结果就是零,所以我们得到更加巧妙的解法,
bool isPowerOfTwo(int n)
{
return (n>0&&((n&(n-1))==0));
}
当然还有一个重要的点就是0,第一种方法自然地过滤了0,但第二种不能简单过滤所以要用&&连一个n>0来实现
然后我带着这个方法踌躇满志地去做3的幂,然后发现不得行,才发现试除法才是这种问题的一般解法,毕竟不是所有数都和2一样特殊。