位操作相关的函数(C++)

本文介绍了C++中用于计算整数二进制位中1的数量的函数,包括C++20引入的std::popcount以及编译器特定的__builtin_popcount。同时,详细讲解了std::bitset类模板,它是用于处理位序列的工具,支持设置、获取、计算和转换二进制位的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

popcount函数

bitset类模板

__builtin_popcount函数


popcount函数

在C++中,std::popcount函数是用来计算一个整数二进制表示中包含的1的个数。不过要注意,这个函数是C++20标准引入的,因此在使用之前,要先确保编译器支持C++20标准。

使用std::popcount非常简单,只需要包含头文件<bit>,然后调用该函数即可。

使用注意:

  1. popcount只接收无符号的整数类型(unsigned int、unsigned char等),不接受任何浮点型的变量。
  2. 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    */

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函数限制了代码的可移植性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值