Linux C:位运算符
一、位运算符
位运算符直接操作数据的二进制位,适用于底层硬件操作、数据压缩、状态控制等场景,效率极高。
1. 基本运算符功能
运算符 | 名称 | 功能说明 |
---|---|---|
& | 按位与 | 对应位均为 1 则为 1,否则为 0(可用于清位、取位) |
| | 按位或 | 对应位有一个为 1 则为 1,否则为 0(可用于置位) |
^ | 按位异或 | 对应位不同则为 1,相同则为 0(可用于交换变量、加密) |
~ | 按位取反 | 0 变 1,1 变 0(注意:对有符号数操作会涉及补码,结果可能为负数) |
<< | 左移 | 数据左移 n 位,右边补 0(等价于数据 * 2^n ,注意溢出) |
>> | 右移 | 数据右移 n 位,左边补符号位(有符号数,算术右移)或补 0(无符号数,逻辑右移),等价于数据 / 2^n (整数除法) |
&按位与:与0得0,| 按位或:或1置1
^异或:相同为0,相异为1<<左移:让数据变大,等价于 * 2^n>>右移:让数据缩小,等价于 / 2^n^异或:可以实现不使用第三方变量完成两个数的交换
2. 常用操作
- 置位(将第 n 位置为 1):
num |= (1 << n);
(n 从 0 开始,如置第 3 位:num |= 1<<3;
) - 清位(将第 n 位置为 0):
num &= ~(1 << n);
(如清第 2 位:num &= ~(1<<2);
) - 取位(判断第 n 位是否为 1):
if (num & (1 << n)) { ... }
- 异或交换变量(无需临时变量):
int a = 3, b = 5; a ^= b; // a = 3^5 = 6 b ^= a; // b = 5^6 = 3(原a的值) a ^= b; // a = 6^3 = 5(原b的值)异或特性: a ^ a = 0,a ^ 0 = a,a ^ b ^ b = a
位运算符优先级:
移位运算符优先级高于其余位运算符使用场景:将一个数据第n位置1:num |= (1 << n);
将一个数据某位置0:num &= ~(1 << n);
注意:
左移溢出:无符号数左移超出位数后高位丢失(如 8 位无符号数 0xff << 1 结果为 0xfe);有符号数左移可能导致符号改变(如 int 型 0x40000000 << 1 会变为负数)