目录
1.题目
2.自解
方法1:调用log函数
代码
提交结果
方法2:循环
提交结果
3.优解
方法3:位运算n & (n-1) ==0
代码
提交结果
方法4:位运算lowbit
代码
提交结果
4.投机取巧的方法
代码
提交结果
1.题目
https://leetcode.cn/problems/power-of-two/?envType=study-plan-v2&envId=primers-list
给你一个整数
n
,请你判断该整数是否是 2 的幂次方。如果是,返回true
;否则,返回false
。如果存在一个整数
x
使得n == 2x
,则认为n
是 2 的幂次方。
示例 1:
输入:n = 1 输出:true 解释:20 = 1示例 2:
输入:n = 16 输出:true 解释:24 = 16示例 3:
输入:n = 3 输出:false
提示:
-231 <= n <= 231 - 1
进阶:你能够不使用循环/递归解决此问题吗?
2.自解
方法1:调用log函数
cpliusplus网的介绍 点我跳转
logarithm n.对数
注意:
1.作用:log函数默认以e为底,则log(x)返回的是的值.
2.参数x的重要提示:x必须大于0
VS2022运行
#include <math.h>
#include <stdio.h>
int main()
{
double m = log(0);
printf("%f", m);
return 0;
}
运行结果
-inf意为(infinity)
将log(0)改为log(-1)再运行
-nan(ind)表示计算结果为非数值(not a number)或无效数值(invalid)
代码
***"给你一个整数 n
"注意0,-1,-2等也是整数!!!!***
bool isPowerOfTwo(int n)
{
if (n<=0)
return 0;
int x=(int)(log(n)/log(2)*1.0);//换底公式
if (pow(2,x)==n)
return true;
else
return false;
}
提交结果
方法2:循环
bool isPowerOfTwo(int n)
{
if (n<=0)
return false;
while(n>1)
{
if (n%2)
return false;
n/=2;
}
return true;
}
提交结果
3.优解
2的幂的二进制数的特点:只有一个位为1,其余全为0
方法3:位运算n & (n-1) ==0
代码
如果n(n>0)为2的幂,一定满足 n & (n-1) ==0
n & (n-1) 直接将 n 二进制表示的最低位 1 移除,若为2的幂,则运算结果为0
bool isPowerOfTwo(int n)
{
if (n>0 && (n & (n-1)) ==0)
return true;
else
return false;
}
其实可以直接返回逻辑运算的结果
bool isPowerOfTwo(int n)
{
return n>0 && (n & (n-1)) ==0;
}
注意:
1.如果以后if+return可以写成像下面这样,而且返回类型为bool
if (条件) return true; else return false;
可以简化为
return 条件;
2.如果反过来
if (条件) return false; else return true;
可以简化为
return !条件;
提交结果
方法4:位运算lowbit
n&(-n) 直接获取 n 二进制表示的最低位的 1
代码
bool isPowerOfTwo(int n)
{
return n>0 && (n==(n&(-n)));
}
提交结果
4.投机取巧的方法
发现n提供的范围为恰为int范围,其中int范围中最大的2的幂数为0x40000000,用0x40000000%n==0
代码
bool isPowerOfTwo(int n)
{
return n>0 && (0x40000000%n==0);
}
提交结果