GCC 内置的位运算函数
GCC(GNU Compiler Collection)为程序员提供了一系列内建位运算函数(built-in bitwise functions),这些函数直接映射为高效的硬件指令或内联实现,极大地提升了性能,尤其适用于系统编程、编解码、图像处理及性能关键场景。
__builtin_clz(x)
含义:Count Leading Zeros,返回x的前导0的个数。
参数类型:unsigned int、unsigned long、unsigned long long。
注意:x不能为0,结果未定义。
unsigned int x = 16; // 二进制:0001 0000
int lz = __builtin_clz(x); // 对32位系统,返回27
__builtin_ctz(x)
含义:Count Trailing Zeros,返回x尾部0的个数。
注意:同样地,x不能为0。
unsigned int x = 16; // 二进制:0001 0000
int tz = __builtin_ctz(x); // 返回4
__builtin_popcount(x)
含义:Population Count,返回x中置位(1)的数量。
unsigned int x = 29; // 二进制:0001 1101
int ones = __builtin_popcount(x); // 返回4
__builtin_parity(x)
含义:返回x中1的个数是否为奇数(奇校验)。返回值为0或1。
unsigned int x = 29; // 4个1,返回0(偶数)
__builtin_ffs(x)
含义:返回x中最低有效的置位(1)的位索引(从1开始),若x == 0,返回0。
int r = __builtin_ffs(18); // 二进制:10010,最低的1在第2位,返回2
注意:与 __builtin_ctz(x) + 1 功能相似,但 __builtin_ctz 未定义0输入,而 __builtin_ffs(0) 返回0,安全性更高。
字节交换函数
字节序(Endian)转换是跨平台编程中常见的问题,GCC 提供了高效的字节交换函数:
__builtin_bswap16(x)__builtin_bswap32(x)__builtin_bswap64(x)
含义:对16/32/64位整数进行大小端交换。
uint32_t val = 0x12345678;
uint32_t swapped = __builtin_bswap32(val); // 结果:0x78563412
用途:常用于网络协议(网络字节序为大端)与本地字节序之间的转换。
注意事项与最佳实践
- 函数名称中会附带位数后缀,如
__builtin_clz,__builtin_clzl,__builtin_clzll分别对应int、long、long long类型。其他几个函数同理。 - 对于
__builtin_clz、__builtin_ctz等,输入为0会导致未定义行为,使用前务必检查。 - 这些函数通常被编译器翻译为一条CPU指令(如 x86 的
bsr,bsf,popcnt等),性能优于手写循环。 - 建议使用明确的类型如
uint32_t/uint64_t,并根据位宽选择正确版本(如__builtin_bswap64)。避免在带符号类型上使用,统一输入无符号数保证一致性。 - 这些函数是 GCC 专有的,在其他编译器(如 MSVC)中未必支持。若需要跨平台,建议使用宏封装或条件编译。

浙公网安备 33010602011771号