如何在C代码中优雅利用ARM Cortex-M3的REV、RBIT等指令?
ARM Cortex-M3 无内联汇编利用RBIT等指令的C代码实现
一、可移植的位反转宏定义实现
要写出兼具可移植性、可读性,还能让编译器自动生成RBIT指令的宏,可以采用分治式位反转的写法——它完全符合标准C语法,非ARM平台也能正常运行,同时主流ARM编译器(ARMCC、GCC)会自动将其优化为单条RBIT指令:
#define REVERSE_BIT_ORDER(x) ({ \ unsigned int val = (x); \ // 交换相邻1位 val = ((val >> 1) & 0x55555555) | ((val & 0x55555555) << 1); \ // 交换相邻2位 val = ((val >> 2) & 0x33333333) | ((val & 0x33333333) << 2); \ // 交换相邻4位 val = ((val >> 4) & 0x0F0F0F0F) | ((val & 0x0F0F0F0F) << 4); \ // 交换相邻8位 val = ((val >> 8) & 0x00FF00FF) | ((val & 0x00FF00FF) << 8); \ // 交换高16位和低16位 val = (val >> 16) | (val << 16); \ val; })
这种写法的优势:
- 跨平台兼容,无需修改就能在非ARM环境运行
- 逻辑分层清晰,每一步位交换操作一目了然,可读性强
- 开启优化后,效率和直接用RBIT指令完全一致
二、循环版位反转函数的编译器优化情况
你给出的循环实现:
unsigned int ReverseBits(unsigned int x) { unsigned int ret = 0; for (int i=0; i<32; i++) { ret <<= 1; if (x & (1<<i)) ret |= 1; } return ret; }
在开启-O2及以上优化等级时,ARM Cortex-M3对应的主流编译器(ARM Compiler 6、GCC)完全能识别这个位反转模式,并直接生成RBIT指令。
需要注意的细节:
- 如果未开启优化(比如用-O0编译),编译器会严格按照循环逻辑生成机器码,不会进行指令替换
- 不同编译器优化能力略有差异,但这类典型的位反转循环,主流ARM编译器都能准确识别并优化
内容的提问来源于stack exchange,提问作者Rocketmagnet
相关产品推荐
相关产品推荐

