日常刷题08

题目:给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1
输出: true
示例 2:
输入: 16
输出: true
示例 3:
输入: 218
输出: false
(来源:力扣(LeetCode))
思路:很明显,对于这道题我们只需要将输入的数不断除以2(假设除了n次),然后看2的n次幂是否等于原数即可。
代码:

bool isPowerOfTwo(int n)
{
    int N;
    int cnt=0;
    N=n;
    if(n<=0)
        return false;
    while(n!=1)
    {
        n/=2;
        cnt++;
    }
    if(pow(2,cnt)==N)
        return true;
    else
        return false;
}

事实上,这题还有更简便的方法。考虑到

2^x(记为n)2^x-1n&(n-1)
(1)10=(0001)2(0)10=(0000)2(0001)&(0000)=0
(2)10=(0010)2(1)10=(0001)2(0010)&(0001)=0
(4)10=(0100)2(3)10=(0011)2(0100)&(0011)=0
(8)10=(1000)2 (7)10=(0111)2(1000)&(0111)=0
………………
所以,代码可以写成:
bool isPowerOfTwo(int n)
{
    return n>0&&(n&(n-1))==0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值