__builtin_xxx指令学习【3】__builtin_popcount & __builtin_popcountll

__builtin_popcount是GCC和Clang编译器提供的用于计算整数中1的个数的内置函数,它利用CPU的POPCNT指令或位运算实现。该函数在位操作和计算机视觉等领域有应用,但可能影响代码的可移植性。__builtin_popcountll则针对64位整数。示例代码展示了其在性能测试中的用法。

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

__builtin_popcount是GCC和Clang编译器提供的一个内置函数,用于计算一个整数中二进制位为1的个数。该函数的使用背景是在一些位运算和计算机视觉等领域中,需要对二进制数据进行处理和分析,而二进制位为1的个数是一个常见的计算需求。

__builtin_popcount的内部原理是使用CPU的指令集来实现计算。具体来说,当CPU支持POPCNT指令时,__builtin_popcount会使用POPCNT指令来计算二进制位为1的个数;否则,__builtin_popcount会使用一些位运算技巧来实现计算。在实现中,__builtin_popcount会根据不同的CPU架构和编译器选项来选择最优的实现方式,从而提高计算效率。

__builtin_popcount的弊端是可能会导致代码的可移植性问题。由于__builtin_popcount是GCC和Clang编译器提供的一个内置函数,因此在使用__builtin_popcount时,需要确保代码的可移植性,并且需要在代码中添加条件编译来处理不支持POPCNT指令的CPU。另外,由于__builtin_popcount的实现依赖于CPU架构和编译器选项,因此在不同的平台和编译器下,__builtin_popcount的性能可能会有所不同。在使用__builtin_popcount时,需要进行性能测试,并根据实际情况选择最优的实现方式。

与之相似的是__builtin_popcountll ,用于计算一个64位整数中1的个数。

下面是一个demo

#include <iostream>
#include <chrono>

int main() {
    auto start = std::chrono::high_resolution_clock::now();
    int count = 0;
    for (int i = 0; i < 100000000; ++i) {
        count += __builtin_popcount(i);
    }
    auto end = std::chrono::high_resolution_clock::now();
    std::cout << "Count: " << count << "\n";
    std::cout << "Time: " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms\n";
    return 0;
}

结果:

#include <iostream>
#include <chrono>

int main() {
    auto start = std::chrono::high_resolution_clock::now();
    long long count = 0;
    for (long long i = 0; i < 100000000; ++i) {
        count += __builtin_popcountll(i);
    }
    auto end = std::chrono::high_resolution_clock::now();
    std::cout << "Count: " << count << "\n";
    std::cout << "Time: " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms\n";
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾牙慧者

欢迎请作者喝奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值