来源Leetcode第231题 2的幂
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
1 | 输入: 1 |
2147483648
最开始的移位比对超时后,评论区有人提到用(2^32 % n),因为2^32 % n一定为0。
1 | public boolean isPowerOfTwo(int n) { |
官方题解
我们不打算在这里讨论时间复杂度为 O(logN) 的解决方案。该问题将通过位运算在 O(1) 的时间复杂度解决,通过使用如下的按位技巧:
- 如何获取二进制中最右边的
1:x & (-x)。 - 如何将二进制中最右边的
1设置为0:x & (x - 1)。
位运算:获取二进制中最右边的 1
易知,x 和 -x 只有一个共同点:最右边的 1。这说明 x & (-x) 将保留最右边的 1。并将其他的位设置为 0。通过 x & (-x) 保留了最右边的 1,并将其他位设置为 0 若 x 为 2 的幂,则它的二进制表示中只包含一个 1,则有 x & (-x) = x。
若 x 不是 2 的幂,则在二进制表示中存在其他 1,因此 x & (-x) != x。
因此判断是否为 2 的幂的关键是:判断 x & (-x) == x。
1 | public boolean isPowerOfTwo(int n) { |
位运算:去除二进制中最右边的 1
易知,x & (x - 1) 可以将最右边的 1 设置为 0。因而,x & (x - 1) 操作会将 2 的幂设置为 0,因此判断是否为 2 的幂是:判断 x & (x - 1) == 0。
1 | public boolean isPowerOfTwo(int n) { |