位运算解决2的幂、4的幂

声明:小白总结,本意是记录自己的思路,不过希望能帮助别人,那就更好啦,若发现问题,欢迎指正,感谢!!
来源:力扣(LeetCode)
链接:2的幂 ---- 4的幂

2的幂

给定一个整数,编写一个函数来判断它是否是 2 的幂次方。

输入: 1
输出: true
解释: 20 = 1

输入: 16
输出: true
解释: 24 = 16

输入: 218
输出: false

从下方的图中发现一些有关2的幂的二进制数的特点
在这里插入图片描述
可以看到,2的幂的二进制数除第一位是1,其余各个位数均为0;并且,2的幂值减一的二进制数每一位数均为1;

然后要谈到符号‘&’,也就是‘and’:

1 & 1 = 1;
1 & 0 = 0;
0 & 1 = 0;
0 & 0 = 0;

再来看一下:
在这里插入图片描述
发现2的幂的数有n & (n - 1) == 0;

代码
// java
class Solution {
    public boolean isPowerOfTwo(int n) {
        int m = n - 1;
        return (n > 0) && (n & m) == 0;
    }
}
4的幂

给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。

输入: 16
输出: true

输入: 5
输出: false

解决了2的幂问题, 趁热打铁,做一下4的幂

想一下2的幂和4的幂的关系,一个数要想是4的幂,首先要是2的幂,那么要满足 (x > 0) && (n & (n - 1))== 0,怎么将非4的幂排除呢
x = 2^a ,若x为4的幂,那么a要是偶数,即a = 2k
a的取值有两种:a = 2k + 1或a = 2k
在这里插入图片描述

代码
// java
class Solution {
    public boolean isPowerOfFour(int num) {
        return (num > 0) && ((num & (num - 1)) == 0) && (num % 3 == 1);
    }
}

感谢各位巨巨们的帮助,希望在记录分析题目的条件下算法能有所提升……
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值