Menu
CoddyTech

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) 时间复杂度!是不是很棒?位操作可以帮助我们大幅优化程序,也能让代码更简单。 

challenge icon

挑战

简单

给定一个数字,使用位操作确定它是否为偶数。 

亲手试试

#include <iostream>

using namespace std;

bool IsPowerOf2(int num) {
    // 在这里编写代码
}

位运算中的所有课

自己练习: C++ 在线编译器

检查进制转换: 进制转换器