Menu
CoddyTech

数字中 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 数据类型的范围。

challenge icon

挑战

中等

使用上述方法完成函数 SetBits,返回给定数字中值为 1 的位数。

亲手试试

#include <cmath>

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

位运算中的所有课

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

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