GCC 内置的位运算函数

GCC(GNU Compiler Collection)为程序员提供了一系列内建位运算函数(built-in bitwise functions),这些函数直接映射为高效的硬件指令或内联实现,极大地提升了性能,尤其适用于系统编程、编解码、图像处理及性能关键场景。

__builtin_clz(x)

含义:Count Leading Zeros,返回x的前导0的个数。
参数类型unsigned intunsigned longunsigned 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 提供了高效的字节交换函数:

  1. __builtin_bswap16(x)
  2. __builtin_bswap32(x)
  3. __builtin_bswap64(x)

含义:对16/32/64位整数进行大小端交换。

uint32_t val = 0x12345678;
uint32_t swapped = __builtin_bswap32(val); // 结果:0x78563412

用途:常用于网络协议(网络字节序为大端)与本地字节序之间的转换。

注意事项与最佳实践

  • 函数名称中会附带位数后缀,如 __builtin_clz, __builtin_clzl, __builtin_clzll 分别对应 intlonglong long 类型。其他几个函数同理。
  • 对于 __builtin_clz__builtin_ctz 等,输入为0会导致未定义行为,使用前务必检查。
  • 这些函数通常被编译器翻译为一条CPU指令(如 x86 的 bsr, bsf, popcnt 等),性能优于手写循环。
  • 建议使用明确的类型如 uint32_t/uint64_t,并根据位宽选择正确版本(如 __builtin_bswap64)。避免在带符号类型上使用,统一输入无符号数保证一致性。
  • 这些函数是 GCC 专有的,在其他编译器(如 MSVC)中未必支持。若需要跨平台,建议使用宏封装或条件编译。
posted @ 2025-04-12 00:10  Ofnoname  阅读(301)  评论(0)    收藏  举报