当前位置: 首页 > article >正文

__builtin_xxx指令学习【3】__builtin_popcount __builtin_popcountll

__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;
}

http://www.kler.cn/a/10020.html

相关文章:

  • Elasticsearch中什么是倒排索引?
  • 吴恩达机器学习笔记(3)
  • 华为网络设备这些“危险命令”,切记不能瞎操作!
  • day60 图论章节刷题Part10(Floyd 算法、A * 算法)
  • ssm093基于Java Web的毕业生就业状况管理系统设计与实现+jsp(论文+源码)_kaic
  • 计算机毕业设计Python+大模型斗鱼直播可视化 直播预测 直播爬虫 直播数据分析 直播大数据 大数据毕业设计 机器学习 深度学习
  • ROS开发之如何使用RPLidar A1二维激光雷达?
  • 基于DSP+FPGA的机载雷达伺服控制系统的硬件设计与开发(一)总体设计
  • VMware vSphere 8.0c - 企业级工作负载平台
  • 腾讯云GPU服务器NVIDIA P40 GPU、P4、T4和GPU自由卡详解
  • 如何测试物联网安全性
  • Linux命令·lsof
  • 数据库导入报错:1452,1832,1215 - Cannot add foreign key constraint 等错误
  • 电瓶隔离器工作原理与发展简史
  • 【财富管理转型】财富管理转型的本质
  • SpringMVC执行流程
  • ICLR 2023 | 达摩院开源轻量人脸检测DamoFD
  • 【MySQL】实验七 视图
  • Ansys Zemax | 如何创建演讲品质的图表和动画
  • 赶紧收藏!网上疯传的150个ChatGPT「超级提问模型」,都在这里了
  • Java基础(十四):包装类
  • libuv系列--queue详解
  • Internet Protocal-OSI模型中的网络分层模型
  • SpringCloud微服务技术栈之网关服务Gateway
  • 华为进军ERP,北用友南金蝶格局或将生变?用户:No!我们选择它
  • spring框架注解