一、题目
二、解题思路
(1)思路一
循环法:2的幂是偶数,除以2余数为0,一直循环的除以2,商为1时,表示次数为2的次幂。
(2)思路二
以下是2的幂次,十进制和二进制的对照表。
十进制 | 二进制 |
---|---|
2 | 10 |
4 | 100 |
8 | 1000 |
16 | 10000 |
以下是2的幂次减一,十进制和二进制的对照表。
十进制 | 二进制 |
---|---|
1 | 01 |
3 | 011 |
7 | 0111 |
15 | 01111 |
将2的幂次与2的幂次减一进行按位取与,如果此数是2的次幂的话,结果为0,由此可以作为判断依据。
注意事项:位运算优先级的问题,最好用小括号括起来,保证没有歧义,避免不必要的问题。
三、虚机测试代码
#include <stdio.h>
#include <stdbool.h>
#define SIZE 7
void main()
{
bool isPowerOfTwo(int n);
int arr[SIZE] = {1,16,3,4,5,8,1073741825};
int i;
for(i=0;i<SIZE;i++)
{
printf("%d : %d\n",arr[i],isPowerOfTwo(arr[i]));
}
}
bool isPowerOfTwo(int n)
{
if(n <= 0)
{
return 0;
}
else if(n == 1)
{
return 1;
}
else if((n&(n-1))==0)
{
return 1;
}
return 0;
}
/*
bool isPowerOfTwo(int n)
{
if(n == 0)
{
return false;
}
while(n % 2 == 0)
{
n = n / 2;
}
if(n == 1)
{
return 1;
}
return 0;
}
*/
四、虚机测试截图
五、leecode提交代码
(1)方法一
bool isPowerOfTwo(int n)
{
if(n == 0)
{
return false;
}
while(n % 2 == 0)
{
n = n / 2;
}
if(n == 1)
{
return 1;
}
return 0;
}
(2)方法二
bool isPowerOfTwo(int n)
{
if(n <= 0)
{
return 0;
}
else if(n == 1)
{
return 1;
}
else if((n&(n-1))==0)
{
return 1;
}
return 0;
}
六、leecode提交截图