目录
popcount函数
在C++中,std::popcount
函数是用来计算一个整数二进制表示中包含的1的个数。不过要注意,这个函数是C++20标准引入的,因此在使用之前,要先确保编译器支持C++20标准。
使用std::popcount
非常简单,只需要包含头文件<bit>
,然后调用该函数即可。
使用注意:
- popcount只接收无符号的整数类型(unsigned int、unsigned char等),不接受任何浮点型的变量。
- popcount的返回值就是参数中的二进制表示中包含1的个数。
用法示例:
#include <iostream>
#include <bit>
using namespace std;
int main() {
unsigned int num = 42; // 二进制表示为 101010
int count = std::popcount(num);
cout << "Number of set bits in " << num << " is: " << count << endl;
return 0;
}
// 输出结果:
/* Number of set bits in 42 is: 3 */
- 更多细节见reference:std::popcount - cppreference.com
bitset类模板
bitset
是C++标准库中的一个类模板,用于表示固定大小的位序列。std::bitset
是一个非常有用的类模板,特别适合处理需要对位进行操作的场景。它提供了方便的方法来设置、获取、计算和转换二进制位序列。
std::bitset
可以看作是一个用于表示位序列的容器,其中每一位都可以是0或1。它的大小在创建时就确定了,并且不能动态地调整大小。
以下是std::bitset
的基本用法示例:
#include <iostream>
#include <bitset>
int main() {
// 创建一个包含8位的bitset,初始值的二进制表示为 10101010
// 其实可以直接 std::bitset<8> bits(252);
std::bitset<8> bits("10101010");
// 获取位数
int size = bits.size();
std::cout << "Size of the bitset: " << size << std::endl;
// 获取特定位的值
bool bitValue = bits[3]; // 获取第4位的值,注意索引从右往左数
std::cout << "Bit at position 3: " << bitValue << std::endl;
// 设置特定位的值
bits[2] = 1; // 设置第3位为1
std::cout << "Modified bitset: " << bits << std::endl;
// 计算1的个数
int count = bits.count();
std::cout << "Number of set bits: " << count << std::endl;
// 将bitset转换为整数
unsigned long long num = bits.to_ullong();
std::cout << "Converted integer: " << num << std::endl;
return 0;
}
__builtin_popcount函数
另外,还有一个__builtin_popcount函数可以用来计算一个整数中设置为1的位的数量。它的返回值就是给定整数的二进制表示中1的个数。
用法示例:
int __builtin_popcount(unsigned int x); // 适用于32位整数
int __builtin_popcountll(unsigned long long x); // 适用于64位整数
但有一个关键点需要注意:__builtin_popcount是一种编译器特定的扩展,并不是C++标准中所包含的,在不同的编译器和编程环境中可能表现不一致或不可用。所以__builtin_popcount函数限制了代码的可移植性。