C语言位操作技巧,看完让你代码更专业
位操作是一种对二进制位进行操作的方式,通过按照位(bit)进行操作。
在C语言中,位操作是指直接对二进制数的位进行操作的一类运算。位操作可以用于修改、清除、切换和检查整型变量的特定位;在嵌入式环境下可以用于对硬件寄存器进行修改,也可以合并状态位用位字段(bit)来管理数据,降低空间占用,因此在一些对性能要求较高的场景下,位操作是一种非常有用的工具。
位操作运算符
对于位操作运算符,主要包含与(&)、或(|)、异或(^)、取反(~)、左移()等操作,这些运算符的功能如下所示。
上述就是主要位操作支持的运算符,下面以格式和例子进行说明。
位操作运算符与`&`
`&`运算符用于对两个操作数的对应位进行与操作,在操作时会对相应位执行与操作,只有当对应位都为1时,结果位才为1,否则为0。
对于与操作,其处理相当于按照位一个个进行处理,每个位都按照或的规则最终输出数据;具体可参考下图所示。
其格式和示例如下所示。
// 与(&)操作格式 A & B // 与(&)操作示例,0b开头表示二进制数 int a = 0b1010; // 10 int b = 0b1100; // 12 int c = a & b; // 0b1000, 8 // 与(&)操作示例,0x开头表示十六进制数 int a = 0x03; // 0b00000011 int b = 0xc1; // 0b11000001 int c = a & b; // 0b00000001, 1位操作运算符或`|`
`|`运算符用于对两个操作数的对应位进行或操作,在操作时会对相应位执行或操作,只要对应位有一个为1时,结果位就为1,否则为0。
对于或操作,其处理相当于按照位一个个进行处理,每个位都按照或的规则最终输出数据;具体可参考下图所示。
其格式和示例如下所示。
// 或(|)操作格式 A | B // 或(|)操作示例,0b开头表示二进制数 int a = 0b1010; // 0xa int b = 0b1100; // 0xc int c = a | b; // 0b1110, 0xe // 或(|)操作示例,0x开头表示十六进制数 int a = 0x03; // 0b00000011 int b = 0xc1; // 0b11000001 int c = a | b; // 0b11000011, 195位操作运算符`^`
`^`运算符用于对两个操作数的对应位进行异或操作,在操作时会对相应位执行异或操作,只有当对应位不同时,结果位才为1,否则为0。
对于异或操作,其处理相当于按照位一个个进行异或处理,具体可参考下图所示。
其格式和示例如下所示。
// 异或(^)操作格式 A ^ B // 异或(^)操作示例,0b开头表示二进制数 int a = 0b1010; // 0xa int b = 0b1100; // 0xc int c = a ^ b; // 0b0110, 6 // 异或(^)操作示例,0x开头表示十六进制数 int a = 0x03; // 0b00000011 int b = 0xc1; // 0b11000001 int c = a ^ b; // 0b11000010, 194位操作运算符`~`
`~`运算符用于对操作数的每个位进行取反操作,在操作时会对相应位执行取反操作,0改为1,1改为0。
对于取反运算符,其处理相当于按照位一个个进行取反处理,具体可参考下图所示。
其格式和示例如下所示。
// 取反(~)操作格式 ~A // 取反(~)操作示例,0b开头表示二进制数 int a = 0b1010; // 0xa int b = ~a; // 0b0101, 5 // 取反(~)操作示例,0x开头表示十六进制数 int a = 0x03; // 0b00000011 int b = ~a; // 0b11111100, 0xfc位操作运算符左移和右移
左移和右移运算符用于对操作数按照位进行移动,左移运算时,高位丢弃,低位补0;右移运算时,高位补符号位,低位丢弃;
对于移位运算符,具体可参考下图所示。
其格式和示例如下所示。
// 左移运算符 a << nums; // 右移运算符 a >> nums; // 左移和右移运算符示例 int a = 0x0F; // 0b00001111 int b = a >> 2; // 0b00000011, 0x03 int c = a << 2; // 0b00111100, 0x3c