数字中 1 的个数
Coddy 位运算 课程的第 11 课,共 17 课。
首先,什么是置位?
在计算机术语中,二进制数中的数字“1”称为置位。
在本课中,我们要计算:
给定数字的二进制形式中有多少个置位。
例如,假设有一个十进制数 (20)10,它的二进制形式是(10100)2,那么 (20)10 中有 2 个置位。
试着想一种方法。你可能会想到先把数字转换成二进制形式,再统计其中 1 的个数。好吧,但如果数字很大呢?你无法在整数数据类型中存储它们,那我们怎么知道大数中有多少个置位呢?答案显然是位运算!
- 首先,我们创建一个位置变量,称为 pos,用来确定二进制数中某个位置上的位。
- 然后,我们将 '1' 左移 pos 次。
- 接着,我们将结果与给定的数字进行 AND 运算。
这有什么用?我们用数字 (20)10 来理解:
- 第一个位置,pos=0。
20 & 1<<pos,1<<pos=1,对 (10100)2 和 (00001)2 进行 AND 运算,结果是零。 - 第二个位置,pos=1。
20 & 1<<pos,1<<pos=(10)2,对 (10100)2 和 (00010)2 进行 AND 运算,结果是零。 - 第三个位置,pos=2。
20 & 1<<pos,1<<pos=(100)2,对 (10100)2 和 (00100)2 进行 AND 运算,结果是一,也就是第一个置位。 - 第四个位置,pos=2。
20 & 1<<pos,1<<pos=(1000)2,对 (10100)2 和 (01000)2 进行 AND 运算,结果是零。 - 第三个位置,pos=2。
20 & 1<<pos,1<<pos=(10000)2,对 (10100)2 和 (10000)2 进行 AND 运算,结果是一,也就是第二个置位。
要统计置位的数量,我们可以用一个计数器变量来记录置位的个数。不过,希望这个例子能让你理解这个算法。
这样,我们就能轻松计算出一个数字的二进制形式中有多少个置位,而不必担心超出 C++ 中 int 数据类型的范围。
挑战
中等使用上述方法完成函数 SetBits,返回给定数字中值为 1 的位数。
亲手试试
#include <cmath>
int SetBits(int num) {
// 在这里编写代码
}位运算中的所有课
自己练习: C++ 在线编译器
检查进制转换: 进制转换器