leetcode——第342题——4的幂

题目:
给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。

整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x

class Solution {
public:
    bool isPowerOfFour(int n) 
    {
        // 法一::自己写的笨笨的解法
        // if(n == 1)  return true;
        // if(n < 4)  return false;
        // int yu;
        // while(n > 3)
        // {
        //     yu = n % 4;
        //     if(yu != 0) return false;
        //     n /= 4;
        // }
        // if(n == 1 && yu == 0) return true;
        // else    return false;

        // 法二::看着幂次方,就要联想到位运算呀
/*
1、先计算 n 的二进制位中对应的 1 的个数,做初步判断,如果个数大于1,则肯定不是4的幂次
2、当符合了第一个条件,在用 while 对二进制进行移位操作,判断 二进制中有几个 0 
    如果有偶数个 0 ,那就是 true

这里有个疑问,感觉只判断了两个条件
第一个: n 的二进制中有 1 个 1
第二个: n 的二进制中有偶数个0

但是没有判断 唯一的一个 1 是不是在最高位,这样是OK的吗?

回答:当然呀,你想想,如果只有一个1,且右移移走了,那这个数不就变成0了吗?小傻瓜
*/
        if(n <= 0)  return false;
        int res = __builtin_popcount(n);
        if (res > 1)    return false;
        int x = 0;
        while(n > 1)
        {
            n >>= 1; //相当于 n = n >> 1 也就是 n = n/2; 
            x++;    // 统计 0 的个数
        }
        // 如果统计 0 的个数能被2整数,说明有 偶数个0
        return x % 2 == 0;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值