当前位置: 首页 > 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/news/10020.html

相关文章:

  • 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框架注解
  • 半个月狂飙1000亿,ChatGPT概念股凭什么?
  • 7.Easyexcel的使用
  • Mac下Python3安装及基于Idea开发
  • 如何面对人生困境至暗时刻
  • 2023年数据挖掘与知识发现国际会议(DMKD 2023) | IOP JPCS独立出版
  • Python 小型项目大全 21~25
  • 一篇搞定Lambda和Stream流
  • 最新CAMx-Python融合技术应用与大气污染来源解析方法应用
  • MongoDB 介绍和基本操作
  • 【设计模式】常用的几种设计模式——单例模式