最后更新于
最后更新于
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。
示例 1:
示例 2:
示例 3:
示例 4:
示例 5:
提示:
-231 <= n <= 231 - 1
进阶:你能够不使用循环/递归解决此问题吗?
一个数 n 是 2 的幂, 当且仅当 n 是正整数, 并且 n 的二进制表示中仅包含 1 个 1.
这种方法思路可以概括为: 找到最低位的1, 将这个1消除后, 剩余的二进制对应的数值是否为0.
n - 1的操作, 会将n中最低位的1置为0, 然后这个1之前的所有位置(到最低位的所有位置)都会被置为1, 因此n & (n - 1)的结果, 会将包括n中原来最低位的1所在位置之内的, 所有低位全部置为0, 达到了消除最低位1的目的.
-n是n的相反数, 负数在二进制中是按照补码规则在计算机中存储的, -n的二进制表示为n的二进制表示的每一位取反再加上1. 因此n中最低位的1取反为0, 这之前的位原来都是0, 取反之后都是1. 加上1之后, 这些位置都会进位变成0, 原来最低位的1又会变为1.
因此如果n中只有一个1, n & (-n)的结果还应为n.