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

__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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

拾牙慧者

欢迎请作者喝奶茶

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

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

打赏作者

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

抵扣说明:

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

余额充值