__builtin_xxx指令学习【4】__builtin_clz&__builtin_ctz & __builtin_clzll & __builtin_ctzll

2023-05-16

__builtin_clz是GCC和Clang编译器提供的一个内置函数,用于计算一个整数的二进制表示中,从最高位开始连续的0的个数。该函数的使用背景是在一些位运算和计算机视觉等领域中,需要对二进制数据进行处理和分析,而从最高位开始连续的0的个数是一个常见的计算需求。

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

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

与之相似的是__builtin_ctz用于计算一个整数的二进制表示中,从最低位开始连续的0的个数。

__builtin_ctz的内部原理是使用CPU的指令集来实现计算。具体来说,当CPU支持CTZ指令时,__builtin_ctz会使用CTZ指令来计算从最低位开始连续的0的个数;否则,__builtin_ctz会使用一些位运算技巧来实现计算。

__builtin_clzll__builtin_ctzll则是64位对应的实现版本。

下面是一个demo

#include <iostream>
#include <chrono>

int main() {
    auto start = std::chrono::high_resolution_clock::now();
    int count_clz = 0;
    int count_ctz = 0;
    long long count_clzll = 0;
    long long count_ctzll = 0;
    for (int i = 0; i < 100000000; ++i) {
        count_clz += __builtin_clz(i);
        count_ctz += __builtin_ctz(i);
        count_clzll += __builtin_clzll(i);
        count_ctzll += __builtin_ctzll(i);
    }
    auto end = std::chrono::high_resolution_clock::now();
    std::cout << "count_clz: " << count_clz << "\n";
    std::cout << "count_ctz: " << count_ctz << "\n";
    std::cout << "count_clzll : " << count_clzll << "\n";
    std::cout << "count_ctzll : " << count_ctzll << "\n";
    std::cout << "Time: " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms\n";
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

__builtin_xxx指令学习【4】__builtin_clz&__builtin_ctz & __builtin_clzll & __builtin_ctzll 的相关文章

  • 无人机拉力测试台研制&测试过程中的9个关键技术点

    随着近年来无人机行业的飞速迭代发展 xff0c 越来越多的相关从业人员选择使用拉力测试台来测试并优化无人机的动力系统 xff0c 本文尝试从无人机拉力测试台的研制和使用角度来阐述无人机拉力测试中的9个关键技术点 1 电磁干扰方面的考虑 测试
  • cv::imread(cv::String const&, int)’未定义的引用

    在 Makefile文件的195 行 LIBRARIES 43 61 opencv core opencv highgui opencv imgproc 后面添加 xff1a opencv imgcodecs opencv videoio修
  • c语言中&与&&区别

    c语言中 amp 与 amp amp 的区别 amp xff1a 按照位与操作 xff0c 例如 xff1a 0010 amp 1101 xff0c 结果为0000 amp 是java中的位逻辑运算 xff1a eg xff1a 2 amp
  • 最简单的 DRM 应用 & drm设备不工作

    https zhuanlan zhihu com p 341895843 https zhuanlan zhihu com p 75321245 编写最简单的 DRM 应用 主程序 xff1a int main int argc char
  • UART&RS232&RS485的区别

    UART RS232 RS485在串口通信中 xff0c 主要区别是电平的不同 xff0c 其中UART通常使用TTL电平 TTL TTL全名是晶体管 晶体管逻辑集成电路 Transistor Transistor Logic 输入高电平最
  • linux中断&poll&selcet按键处理机制

    在上一篇linux按键中断处理中 xff0c 我们采用按键中断处理获取按键 xff0c 在read函数中阻塞读取 xff0c 当按键发生时 xff0c read自动解除阻塞 xff0c 实现应用层读取到相应的按键值 在上一节中如果没有按键到
  • ubuntu(15):对‘casadi::MX::MX(casadi::MX const&)’未定义的引用

    catkin build 编译报错 xff0c 找不到CASADI的头文件目录CASADI INCLUDE DIRS或者库文件也达不到CASADI LIBRARIES xff1b 对 casadi MX horzsplit casadi M
  • PHP 返回如果 isset [重复]

    这个问题在这里已经有答案了 可能的重复 有更简洁的方法来设置默认值吗 是否有一个内置的 php 函数 如下所示 function isset get array key default null return isset array key
  • 内置 python 函数的时间/空间复杂度

    split strip open 内置 python 函数 的时间 空间复杂度是多少 有谁知道我可以在哪里查找这些函数的时间 空间复杂度 确切的答案将取决于输入到函数中的属性 最简单的找出方法可能是检查这些函数的源代码 python 源代码
  • 如何取消隐藏被覆盖的函数?

    假设我有自己的函数 名为zeros在Matlab路径上 现在我想调用内置的zeros 我怎样才能做到这一点 Use the builtin功能 builtin function arg1 argN 在你的情况下 例如 builtin zer
  • Go 内置函数是否使用泛型?

    看看 Go 的内置函数 我才意识到它们不使用接口 而是使用神奇的 类型 https golang org src builtin builtin go https golang org src builtin builtin go 那么 在
  • 覆盖 {...} 符号,以便我得到 OrderedDict() 而不是 dict()?

    更新 Python 3 7 保证保留插入顺序的字典 我想像配置文件一样使用 py 文件 所以使用 我可以使用字符串作为键创建字典 但定义顺序在标准 python 字典中丢失 我的问题 是否可以覆盖 符号以便我得到OrderedDict 代替
  • 从文件路径中提取文件扩展名

    如何提取给定文件路径的文件扩展名作为字符 我知道我可以通过正则表达式来做到这一点regexpr alnum x 但想知道是否有内置函数可以处理这个问题 使用 R 基本工具很容易找到这种东西 例如 路径 无论如何 加载tools打包并读取 f
  • 如何覆盖 javascript 本机对象的内置方法

    假设我们有窗口对象的警报方法 我想用漂亮的警报框来增强它 另外 我想保存现有的警报方法 以便我们可以在应用程序结束后切换回来 类似这样的东西 但它在 Firefox 控制台中抛出错误 window prototype alert funct
  • 无法对内置 String 对象进行子类化

    我一直在尝试使用 Node 5 3 0 对 ES2015 中的内置 String 对象进行子类化 我正在使用一堆和谐标志运行未转译的代码 这是完整的命令 node harmony harmony modules harmony destru
  • 如何在pycharm中查看python内置函数的执行情况?

    当我尝试在 PyCharm 中查看内置函数 all 时 我只能在函数体中看到 pass 如何查看实际的实现以便我可以知道内置函数到底在做什么 def all args kwargs real signature unknown Return
  • 为什么我可以从“eval”调用“print”

    对于代码 usr bin python src print import os obj compile src exec eval obj builtins False 我得到输出 Traceback most recent call la
  • 如何禁用vim中的内置命令

    在vim中 当我点击 wq这几乎总是在尝试输入时发生的意外 w 我想禁用 wq 我发现的最接近的是cmap 但它有一些奇怪的行为 如果我做类似的事情 cmap wq w 我什至无法输入 wq 它只是重新映射击键顺序wq to w在命令模式下
  • __builtin_trap:什么时候使用它?

    gcc 提供了额外的内置函数 用于优化 其中之一是void builtin trap void 本质上是通过执行非法命令来中止程序 来自文档 builtin trap函数导致程序异常退出 GCC 实现了这个 通过使用目标相关机制 例如有意
  • 为什么Python有格式化函数和格式化方法

    The format http docs python org 2 library functions html format内置函数中的函数似乎是str format http docs python org 2 library stdt

随机推荐

  • 港科大GVINS编译与运行教程

    GVINS GVINS是香港科技大学沈劭劼团队开源的基于因子图优化的GNSS 视觉 惯导紧耦合多传感器组合导航软件 GVINS是一个基于非线性优化的系统 xff0c 它将 GNSS 原始测量与视觉和惯性信息紧密融合 xff0c 以实现实时和
  • 硬件结构——(6) 软中断

    1 中断是什么 xff1f 在计算机中 xff0c 中断是 系统用来响应硬件设备请求 的一种机制 操作系统收到 硬件的中断请求后 xff0c 会打断正在执行的进程 xff0c 然后调用内核中的 中断处理程序 来响应请求 中断是 种 异步的事
  • C++将类序列化和反序列化到共享内存

    这里用模板泛化一下 template lt typename T gt int saveToShm const T amp obj key t key 61 gen shm key int shmId 61 shmget key sizeo
  • C++使用rapidjson进行类的序列化与反序列化

    目录 序列化 amp 反序列化单个对象序列化反序列化使用示例 序列化 amp 反序列化对象列表 C 43 43 中可以使用第三方库来实现将类序列化成JSON文件 xff0c 以及读取JSON文件内容反序列化为类对象 这里使用rapidJso
  • c++用vector实现定长队列

    目录 queue实现vector实现 我们可以用queue或vector实现定长队列 xff0c 但是如果我们有遍历定长队列的需求的话 xff0c 使用queue不是一个好的选择 xff0c 因为queue本身不支持直接访问元素 queue
  • c++判断文件是否存在

    可以使用C 43 43 的文件流来判断文件是否存在 以下是一个简单的函数 xff0c 可以通过文件名判断文件是否存在 xff1a span class token macro property span class token direct
  • 相机内外参数的意义

    1 内参数 xff1a 由于相机坐标系使用的是毫米制的单位 xff0c 而图像平面使用的像素为单位 内参数的作用就是在这两个坐标系之间进行线性的变化 相机光轴中心Z轴方向与像平面交点称为投影中心 xff0c 其坐标为 xff0c 其单位为像
  • C++实现读写分离的双缓冲buffer

    目录 1 双缓冲区 读写分离2 后台线程定时更新数据3 类设计完整代码cache cppcache hmain cppmakefile 读写分离的双缓冲buffer有以下好处 xff1a 提高了并发读写的效率 xff1a 在多线程环境下 x
  • 返回引用与返回值与返回std::move(obj)

    返回引用与返回值相比 返回引用与返回值相比有以下几个好处 xff1a 减少内存开销 xff1a 返回值需要在函数内部创建一个临时对象 xff0c 然后将该对象的副本返回给调用者 这个过程需要分配内存 复制数据等操作 xff0c 会增加内存开
  • error: non-member function ‘XXX::IsValid(const T&)’ cannot have cv-qualifier

    这个错误提示表明你定义的函数 IsValid 是一个非成员函数 xff0c 并且带有 const 限定符 在 C 43 43 中 xff0c 非成员函数不能带有 const 限定符 xff0c 因为它们没有隐式的 this 指针 xff0c
  • c++使用regex报错regex_error

    原本写了个同时识别IPv4和IPv6地址的C 43 43 函数 xff1a span class token macro property span class token directive hash span span class to
  • c++实现日志类(写入logfile)

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • c++中以类对象作为key用于unordered_map、map,以及std::tie技巧使用

    我有一个类 span class token keyword class span span class token class name UserRegion span span class token punctuation span
  • std::set_difference用法

    std set difference 是 C 43 43 STL 中的一个算法 xff0c 用于计算两个有序范围之间的差集 xff0c 并将结果存储到另一个有序范围中 std set difference 的函数签名如下 xff1a spa
  • __builtin_xxx指令学习【1】__builtin_expect

    builtin expect是GCC编译器提供的一个内置函数 xff0c 用于告诉编译器一个分支的执行概率 xff0c 以便编译器在生成机器码时进行优化 它的语法如下 xff1a span class token function buil
  • __builtin_xxx指令学习【2】__builtin_prefetch

    builtin prefetch是GCC编译器提供的一个内置函数 xff0c 用于预取数据到CPU的缓存中 xff0c 以便提高程序的执行效率 它的语法如下 xff1a builtin prefetch const void addr in
  • __builtin_xxx指令学习【3】__builtin_popcount & __builtin_popcountll

    builtin popcount是GCC和Clang编译器提供的一个内置函数 xff0c 用于计算一个整数中二进制位为1的个数 该函数的使用背景是在一些位运算和计算机视觉等领域中 xff0c 需要对二进制数据进行处理和分析 xff0c 而二
  • 当arduino遇到树莓派(usb串口)

    arduino与树莓派cm4通过usb串口连接 xff1a 问题描述 前两天尝试了很久arduino和树莓派连接 终于找到了连接的方法 xff01 可恶 这是在简书找到的过程 主要是先在树莓派端导serial包 pip install se
  • Linux的rc.local自启动服务

    Linux的rc local自启动服务 网址 xff1a http blog csdn net 21aspnet article details 6826659 Linux有自己一套完整的启动体系 xff0c 抓住了linux启动的脉络 x
  • __builtin_xxx指令学习【4】__builtin_clz&__builtin_ctz & __builtin_clzll & __builtin_ctzll

    builtin clz是GCC和Clang编译器提供的一个内置函数 xff0c 用于计算一个整数的二进制表示中 xff0c 从最高位开始连续的0的个数 该函数的使用背景是在一些位运算和计算机视觉等领域中 xff0c 需要对二进制数据进行处理