1. C语言位运算基础概念解析
位运算是C语言中直接操作二进制位的运算符,相比算术运算具有更高的执行效率。在嵌入式开发、加密算法、硬件寄存器操作等场景中应用广泛。理解位运算需要掌握两个核心前提:二进制表示形式和补码机制。
计算机中所有数据最终都以二进制形式存储。以char类型为例,1字节(8位)可以表示-128~127的有符号整数。补码机制保证了加减运算的统一性,最高位为符号位(0正1负),正数的补码是其本身,负数的补码是绝对值的二进制表示取反加1。
重要提示:位运算只能用于整型数据(char/short/int/long等),浮点数(float/double)无法进行位运算,这是由IEEE 754浮点格式的特殊性决定的。
1.1 位运算符分类与优先级
C语言提供了6种基本位运算符,按优先级从高到低排列:
- ~ 按位取反(一元运算符)
- << 左移、>> 右移
- & 按位与
- ^ 按位异或
- | 按位或
运算符优先级决定了复杂表达式的计算顺序。例如表达式 ~a | b << 1 的实际运算顺序是:先对a取反(~),然后b左移1位(<<),最后执行按位或(|)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 六大位运算符深度解析
2.1 按位取反(~)
按位取反是一元运算符,将操作数的每一位取反(0变1,1变0)。其优先级高于算术运算符。
c复制unsigned char a = 0b0101; // 二进制0101(十进制5)
unsigned char b = ~a; // 二进制1010(十进制10)
实际开发中常用于:
- 快速计算补码:
-x = ~x + 1 - 掩码生成:
mask = ~(0xFF << n)生成低n位为1的掩码
2.2 移位运算符(<< 和 >>)
移位运算分为左移(<<)和右移(>>),格式为操作数 运算符 移动位数。
左移运算符(<<):
- 高位移出丢弃
- 低位补0
- 每左移1位相当于乘以2(可能溢出)
c复制uint8_t x = 0b0011; // 3
x = x << 1; // 0b0110 (6)
右移运算符(>>):
- 低位移出丢弃
- 高位补符号位(算术右移)
- 每右
