2 的幂
Coddy 位运算 课程的第 9 课,共 17 课。
如果你已经熟悉二进制数,那么到现在你一定已经发现,所有 2 的幂都只包含 1 个置位(置位指的是“1”)。例如,(2)10 = (10)2,(4)10 = (100)2 ,(8)10 = (1000)2 ,依此类推。
在这一课中,我们要讨论的问题是:
使用位操作判断给定的数字是否为 2 的幂。
好!那么,上面的观察能如何帮助我们呢?一起来看看。
- 假设给定了 (8)10,我们知道它是 2 的幂。
- 从它减去 1,得到 (7)10,它等价于 (0111)2。
- 如果对 7 和 8 执行 AND(&)运算,结果就是 0。
- 很有趣,对吧?再来看另一个 2 的幂。以 (32)10 为例,它等价于 (100000)2, ,从它减去 1,也就是 (31)10 = (011111)2。结果又是 0!
- 那么,我们能否概括地说,对于一个数字,假设称它为 x,如果它是 2 的幂,那么 ( x & (x-1) ) 总是 '0'?
利用这个观察,我们可以轻松解出这道题,不必使用数学库及其幂函数,也不必使用任何循环。我们只用了 O(1) 时间复杂度!是不是很棒?位操作可以帮助我们大幅优化程序,也能让代码更简单。
挑战
简单给定一个数字,使用位操作确定它是否为偶数。
亲手试试
#include <iostream>
using namespace std;
bool IsPowerOf2(int num) {
// 在这里编写代码
}位运算中的所有课
自己练习: C++ 在线编译器
检查进制转换: 进制转换器