在Linux C语言中,确实有对位(bit)进行操作的能力。C语言提供了多种位操作的方式:
C语言提供了以下位运算符:
- &
按位与
- |
按位或
- ^
按位异或
- ~
按位取反
- <<
左移
- >>
右移
unsigned char a = 0x0F; // 二进制 00001111
unsigned char b = 0x55; // 二进制 01010101
unsigned char c = a & b; // 00000101 (0x05)
unsigned char d = a | b; // 01011111 (0x5F)
unsigned char e = a ^ b; // 01011010 (0x5A)
unsigned char f = ~a; // 11110000 (0xF0)
unsigned char g = a << 2;// 00111100 (0x3C)
unsigned char h = b >> 1;// 00101010 (0x2A)
C语言结构体支持位域,可以精确控制每个成员占用的位数:
struct {
unsigned int flag1 : 1; // 1位
unsigned int flag2 : 3; // 3位
unsigned int : 2; // 2位未使用
unsigned int flag3 : 2; // 2位
} status_flags;
Linux内核提供了专门的位操作函数和宏,定义在<linux/bitops.h>
中:
set_bit(nr, addr); // 设置addr指向的变量的第nr位
clear_bit(nr, addr); // 清除addr指向的变量的第nr位
test_bit(nr, addr); // 测试addr指向的变量的第nr位
常用位掩码技术来处理标志位:
#define FLAG_1 (1 << 0) // 00000001
#define FLAG_2 (1 << 1) // 00000010
#define FLAG_3 (1 << 2) // 00000100
unsigned int flags = 0;
// 设置标志
flags |= FLAG_1 | FLAG_3;
// 清除标志
flags &= ~FLAG_1;
// 检查标志
if (flags & FLAG_2) {
// FLAG_2被设置
}
在Linux系统编程中,位操作常用于设备驱动、网络协议、文件权限等底层操作中。