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