342. 4的幂

342. 4的幂

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

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

示例 1:

输入:n = 16
输出:true

示例 2:

输入:n = 5
输出:false

示例 3:

输入:n = 1
输出:true

提示:

  • -231 <= n <= 231 - 1

进阶:

  • 你能不使用循环或者递归来完成本题吗?

代码与思路

我们把思路转化成第一步,判断是否是2的幂,第二步,再判断是否是4的幂,就可以比较简单的求出答案。
第一步
先来一个数如果是2的幂次方,那么它的二进制表示最前方只有一个1。

8421
2的0次方1
2的1次方10
2的2次方100
2的3次方1000

判断一个数是不是2的幂次方,用到了这个公式n & (n-1),其中&表示按位与运算。该位运算技巧可以直接将n二进制表示的最低位1移除。

8----10000
7----01111
&----00000

因为2的n次方的二进制表示只有一个1。我们把它移除了(就像上面把数字8中的一移除),如果n是正整数并且n&(n-1)=0,那么n就是2的幂。
代码

    bool isPowerOfTwo1(int n) {
        return n > 0 && (n & (n - 1)) == 0;
    }

第二步
表格

6432168421
2的幂2^42^32^22^12^0
4的幂4^24^14^0

如果 n 是 4 的幂,那么 n 的二进制表示中有且仅有一个 1,并且这个 1 出现在从低位开始的第偶数个二进制位上。
那如何知道它的偶数位上是不是1呢。
我们可以构造一个整数mask,它的所有偶数二进制都是0,所有奇数二进制位都是1。将n和mask进行按位与运算,如果结果为0,说明n二进制表示中的1出现在偶数位置,否则出现在奇数的位置。

mask----1010101010101010101010101010101016进制表示
mask---0xaaaaaaaa

说明,因为10的二进制为1010,所以一个10可以表示4位二进制,8个a就可以表示32位二进制数。

8----1000
&----1010---1000

代码

    bool isPowerOfFour(int n)
    {
        return n > 0 && (n & (n - 1)) == 0 && (n & 0xaaaaaaaa) == 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值