基于C内联__asm()的最小32位位反转实现及优化问询
32位位反转的最小代码体积优化方案
现有内联汇编实现(23字节)
这是最初实现的23字节内联汇编版本,通过字节交换和位掩码操作完成反转:
uint32_t reverse_bits_23b(uint32_t x) { __asm__( "movl %0, %%eax\n" "bswap %%eax\n" "movl %%eax, %%ebx\n" "shrl $16, %%eax\n" "andl $0x00FF00FF, %%ebx\n" "andl $0xFF00FF00, %%eax\n" "shrl $8, %%ebx\n" "shll $8, %%eax\n" "orl %%ebx, %%eax\n" "movl %%eax, %0\n" : "=r"(x) : "0"(x) : "%eax", "%ebx" ); return x; }
优化后的13字节内联汇编版本
通过精简指令序列(使用bswap、循环移位和字节交换指令),将汇编代码压缩至13字节:
uint32_t reverse_bits_13b(uint32_t x) { __asm__( "bswap %0\n" "mov $4, %%cl\n" "ror %cl, %0\n" "xchgb %h0, %b0\n" "rorw $2, %0\n" "xchgb %h0, %b0\n" "rorw $1, %0\n" "xchgb %h0, %b0\n" : "=r"(x) : "0"(x) : "%cl" ); return x; }
进一步缩减体积的其他方案
1. 编译器内建函数
利用编译器原生内建函数,代码最简洁且编译后生成最优机器码:
- GCC/Clang:直接调用
__builtin_bitreverse32(x),仅一行C代码,编译后会根据目标架构生成最小体积的指令序列(如ARM下直接生成rbit指令)。 - MSVC:新版本支持
__builtin_bitreverse32,或使用_rotr组合位操作实现。
2. 专用架构汇编指令
针对特定架构的专用指令,能实现极致的体积压缩:
- ARM架构:使用
rbit指令,仅4字节机器码:uint32_t reverse_bits_arm(uint32_t x) { __asm__("rbit %0, %0" : "=r"(x) : "0"(x)); return x; } - x86-64(BMI2扩展):使用
pdep指令配合全1掩码,实现紧凑反转:uint32_t reverse_bits_bmi2(uint32_t x) { __asm__("pdep %0, %1, %0" : "=r"(x) : "0"(0xFFFFFFFF), "1"(x)); return x; }
3. 原生C紧凑实现
采用分治思想的原生C代码,编译后体积接近手动汇编,且跨平台性更好:
uint32_t reverse_bits_c(uint32_t x) { x = (x >> 16) | (x << 16); x = ((x >> 8) & 0x00FF00FF) | ((x << 8) & 0xFF00FF00); x = ((x >> 4) & 0x0F0F0F0F) | ((x << 4) & 0xF0F0F0F0); x = ((x >> 2) & 0x33333333) | ((x << 2) & 0xCCCCCCCC); x = ((x >> 1) & 0x55555555) | ((x << 1) & 0xAAAAAAAA); return x; }
内容的提问来源于stack exchange,提问作者vengy
相关产品推荐
相关产品推荐

