首页 > 自考资讯 > 培训提升

扩展普通运算,C语言位操作应用让你的代码更高效

2026 08 27 03:32:21

对于位操作符来说,主要的应用于以下几个场景。

将特定位清零或者置1,主要用于修改状态位。行特定位取反,可以是单个或者多个位。获取特定位的值,可以通过与操作和右移操作实现。进行位翻转,例如将一个字节的位顺序翻转。

基于以上场景,位操作符的应用主要体现在以下几个方面。

特定位处理

对于位的处理,支持对特定位进行清零、置1、取反、获取值、判断是否为1等操作。

关于位处理,具体示例如下所示。

#include <stdio.h>int main(int argc, char const *argv[]){ // 将特定位清零 int a = 0xcf; // 0b11001111 int b = a & ~(0x03 << 1); // 0b11001001, 0xc9 // 将特定位置1 int c = b | (0x01 << 1); // 0b11001011, 0xcb // 获取特定位的值 int d = (c >> 4)&0x0f; // 0b00001100, 0x0c printf("b = 0x%02x\n", b); printf("c = 0x%02x\n", c); printf("d = 0x%02x\n", d); // 判断特定位是否为1 int e = (c >> 3) & 0x01; // 0b00000001, 0x01 printf("e = 0x%02x\n", e); return 0;}

对于上述代码,执行结果如下所示。

可以看到,通过位操作运算符,我们可以对特定位进行清零、置1、取反、获取值、判断是否为1等操作,可以用于寄存器的功能位的修改,在嵌入式系统中应用广泛。

除法运算优化

右移运算符有一个重要特性就是在部分运算中可以代替除法运算,提高操作效率。

对于2的幂次方的除法,右移运算符可以直接进行右移,例如除2右移1位、除4右移2位,依次类推。对于非2的幂次方除法,可以先乘法再右移的方式,取接近的2的幂次方,再进行右移,精度要求不高时可以使用此方法优化。

示例如下所示。

#include <stdio.h>int main(int argc, char const *argv[]){ int a = 523; printf("a/2 = %d\n", a/2); printf("a/2^1 = %d\n", a>>1); printf("a/53 = %d\n", a/53); printf("a*2473/2^17 = %d\n", a*2473>>17); return 0;}

对于上述代码,执行结果如下所示。

使用位运算和乘法代替除法,对于不支持硬件除法的单片机(如8051),可以提高运算效率且避免除法库的调用,降低存储占用,也是比较常用的优化方式之一。

大小端转换

对于大小端转换,主要是通过位操作符左移/右移来实现,具体示例如下所示。

#include <stdio.h>#include <stdint.h>#define SWAP16(x) ((uint16_t)((((uint16_t)(x) & 0xFF00) >> 8) | (((uint16_t)(x) & 0x00FF) << 8)))#define SWAP32(x) ((uint32_t)((((uint32_t)(x) & 0xFF000000) >> 24) | \ (((uint32_t)(x) & 0x00FF0000) >> 8) | \ (((uint32_t)(x) & 0x0000FF00) << 8) | \ (((uint32_t)(x) & 0x000000FF) << 24)))int main(int argc, char const *argv[]){ uint16_t data16 = 0x1234; printf("原始数据: 0x%04X\n", data16); printf("转换后数据: 0x%04X\n", SWAP16(data16)); uint32_t data32 = 0x12345678; printf("原始数据: 0x%08X\n", data32); printf("转换后数据: 0x%08X\n", SWAP32(data32)); return 0;}

对于上述代码,具体执行结果如下所示。

可以看到,通过位操作符左移/右移,我们可以实现16位和32位数据的大小端转换;这对于跨平台通信和数据存储非常重要。

版权声明:本文转载于今日头条,版权归作者所有,如果侵权,请联系本站编辑删除

猜你喜欢