一、位运算符
6种操作运算符
运算符 | 含义 | 运算符 | 含义 |
---|---|---|---|
& | 按位与 | ~ | 取反 |
| | 按位或 | << | 左移 |
^ | 按位异或 | >> | 右移 |
取反
~ | 010101 |
---|---|
101010 |
与
& | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
或
& | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 1 |
亦或
& | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
左移<<
1010 左移 1位 0100
右移>>
1010 右移 1位 0101
位操作
unsigned short var;
对var完成以下操作: bit[0...7]
将bit[7]设置为1: var |= (1<<7);
将bit[7]设置为0: var &= ~(1<<7)
将bit[7]反转: var ^= (1<<7);
将bit[7:4]4个位设置为1: var |= 0xF0; var|=(0xF<<4)
将bit[7:4]4个位设置为0: var &= 0x0F; var &= ~(0xF<<4)
将bit[7:4]4个位反转: var ^= (0xF<<4)
将bit[7:4]设置为1010: var |= (0xa<<4); var&= ~(5<<4);
查看bit[7]的值: (var>>7) & 1
查看bit[7:4]的值: (var>>4) & 0xF
查看bit[6:5]的值: (var>>5) & 0x3
二、位字段
位字段(bit filed)是C语言中一种存储结构,不同于一般结构体的是它在定义成员的时候需要指定成员所占的位数。位字段是一个signed int或unsigned int类型变量中一组相邻的位(C99和C11新增了Bool类型的位字段)。位字段通过一个结构声明来建立,该结构声明为每个字段提供标签,并确定该字段的宽度,例:
struct
{
unsigned int Sun: 1;
unsigned int Mon: 1;
unsigned int Tue: 1;
unsigned int Wed: 1;
unsigned int Thur: 1;
unsigned int Fri: 1;
unsigned int Sat: 1;
} week;
在上面的这个 星期的结构中,提供了7个1位的字段,每一个字段就代表其中一天。这个就可以通过结构成员运算符点( . )来对每一个字符赋值。
week.Mon = 1;
week.Tue = 1;
week.Wed = 1;
week.Thur = 1;
week.Fri = 1;
week.Sat = 0;
week.Sun = 0;
通过结构运算符设置周一到周五的值为1,周末值为0。通过这样的方式可以单独操作字节中的某一位,和单片机中对于寄存器的操作就很类似了。由于每个字段只占了一位,所以字符的值只能是0或者1。还可以将每个字段设置为多个位。
在C语言中规定,如果声明的总位数超过了一个unsigned int 类型的大小,就会用到下一个unsigned int 类型的存储位置,一个字段不允许跨越两个unsigned int之间的边界,编译器会自动移动跨界的字段。保持unsigned int的边界对齐。