一、题目描述:
给你一个整数 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 示例 4:
输入:n = 4 输出:true 示例 5:
输入:n = 5 输出:false
提示:
-231 <= n <= 231 - 1
进阶:你能够不使用循环/递归解决此问题吗?
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/po…
二、思路分析:
一个数 n 是 2 的幂,当且仅当 nn 是正整数,并且 n的二进制表示中仅包含 1个 1。
因此我们可以考虑使用位运算,将 n 的二进制表示中最低位的那个 1 提取出来,再判断剩余的数值是否为 0 即可
解题思路如下: 若 n = 2^x
且 x 为自然数(即 n 为 2 的幂),则一定满足以下条件: 恒有 n & (n - 1) == 0,这是因为: n 二进制最高位为 1,其余所有位为 0; n - 1 二进制最高位为 0,其余所有位为 1; 一定满足 n > 0。 在处理完这些边界之后,尝试将 n 除干净,如果最后剩余数值为 1 则说明开始是 2 的幂。 因此,通过 n > 0 且 n & (n - 1) == 0 即可判定是否满足 n = 2^x 。
三、AC 代码:
class Solution { public boolean isPowerOfTwo(int n) { if (n <= 0) return false; while (n % 2 == 0) n /= 2; return n == 1; } }
四、总结:
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐