第11章 位运算
第一节 位运算符 一般用字节(Byte)作为计算机信息的基本单位,一个字节由8个二进制位组成,其中最右边的一位称为“最低有效位”LSB,最左边的一位称为“最高有效位”MSB,如图11-1所示。最低有效位也称第0位,最高有效位也称第7位。
C语言提供了6种位运算符,如表11-1所示。
说明: (1) 位运算符中除了“~” 以外,均为二目运算符。 (2) 运算量只能是整型或字符型的数据,不能为实型数据。
一、 位“与”运算(&) 1.运算规则 参加运算的两个运算量,如果两个相对应的位都为1,该位结果值为1,否则为0。可记为“见0则0”。
2.“按位与”的特殊用途
(1)清零 方法:任何数与一个各个位均为零的数值相与,结果为零。
(2)取一个数X中某些指定位。 方法:找一个数,此数的各个位将按照这样原则取值:对应于x要取的位,该数对应位为1,其余位为0。则此数与x按位相与就可以得到X中的某些位。 例11-3 假设有X=l0101110B,想取X的低4位。 分析:由于欲取X的低4位1,则可以将X与Y=00001111B相与,即可得到X的低4位。则有:
二、 位“或”运算 1.运算规则 参加运算的两个运算量,如果两个相对应的位中有—个为1,则该位结果值为1,否则为0。可记为“见1则1”。
2.“按位或”的特殊用途: 常用来对一个数据的某些位置1: 就是找一个数,此数的各个位将按照这样规则取值:对应于X要置1的位,该数对应位为1,其余位为零0,则此数与X相或就可使X中的某些位置1。 例11-5 假设有X=11010010B,想使X的低4位为l。
三、 “异或”运算(^)
1.运算规则 参加运算的两个运算量,如果两个对应的位为相“异”(值不同),则该位结果值为1。可记为“见同则0”。
2.“异或”的特殊用途:使特定位翻转 方法:找—个数,此数的各个位将按照这样规则取值:对应于X要翻转的位,该数对应位为1,其余位为零。则此数与X相异或即可。 例ll-7 假设有X=10101110B,则想使X的低4位翻转。
四、 “取反”运算(~) 1.运算规则 对一个二进制数按位取反,即将0变为l,1变为0。
2.注意事项 (1) 单目运算符,具有右结合性; (2) ~运算符的优先级别比算术运算符、关系运算符逻辑远符和其运算符都高。 五、 “左移”运算(<<) 运算规则:将一个数的各个二进制全都左移若干位(左丢弃,右补0)。 六、 “右移”运算(>>) 运算规则:将一个数的各个二进制全部右移若干位。最端低位丢弃,对于无符号数最高位补0;对于有符号数:正数则最高位补0,如果为负数,左端最高位补0还是补1则取决于所用的C编译系统。如果补0则称为“逻辑右移”,补l则称为“算术右移”。 七、 位运算赋值运算 位运算符与赋值运算符相结合,就组成复合赋值运算符,表11-2所示。
第二节 位段 有时信息不需要一个字节,只要一位或几位即可,例如:网络传输协议,控制信息往往只用一个字节中的一位或几位。 在C语言中,为了方便访问这些信息,定义了位段(或称“位域”)类型,它是用结构体来表示的。所谓位段是把一个字节中的二进位划分为几个不同的段,并说明每个段的位数。每个段有一个段名,允许在程序中按段名进行操作。这样就可以把几个不同的对象用一个字节的不同二进制位段来表示。 一、 位段的定义 位段的定义形式: struct 位段结构{位段列表}; 位段列表的形式: 类型说明符 位段名:位段长度 例如: struct wd { int a:5; int b:2; int c:1; unsigned d:5; } 对位段的定义的几点说明: (1) 位段的成员类型必须定义指定为unsigned或int型。 (2) 一个位段必须存只能储某一个字节中,不能跨两个字节。如一个内存单元所剩空间不够存放另一位段时,应从下一内存单元起存放该位段。也可以有意使某位段从下一内存单元开始。 (3) 位段成员的长度不能大于一个字节的长度,即不能超过8位二进位。 (4) 位段可以含无名成员,这时它只用来作填充或调整位置。无名的位段成员是不能使用的。 二、 位段的引用 位段的引用和结构成员的引用相同、其一般形式为 位段变量名. 位段成员名 位段允许用各种格式输出。 例ll-11 位段成员的输出格式。 程序如下:(WYS02.C) #include <stdio.h> void main() { struct { unsigned a:1; unsigned b:3; int :3; unsigned c:4; }bit,*pb; bit.a=1; bit.b=7; bit.c=15; printf("%d,%d,%d"n",bit.a,bit.b,bit.c); pb=&bit; pb->a=0; pb->b^=5; pb->a&=0xa; printf("%x %x %x"n",pb->a,pb->b,pb->c); } 运行结果: 1,7,15 0 2 f 分析: (1) 程序中定义了位段结构,3个位段成员为a,b,c,说明了此类型的变量bit和指向此类型的指针变量pb。 (2) 程序接下来分别给3个位段成员赋值。(注意赋值不能超过该位域的允许范围) (3) 程序进跟着以整型量格式输出3个位段成员的内容。 (4) 然后程序把位段变量bit的地址送给指针变量pb。 (5) 程序接下来使用指针给更新位段成员的值。 (6) 程序最后使用指针输出了这3个位段成员的值。 |
转载于:https://www.cnblogs.com/ThirdEye/archive/2009/04/04/1429485.html