《第9章 C语言的位运算.ppt》由会员分享,可在线阅读,更多相关《第9章 C语言的位运算.ppt(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C语言教学语言教学幻灯片版幻灯片版第九章位运算第九章位运算9.19.1位运算符与位运算位运算符与位运算9.29.2位段位段9.39.3程序设计举例程序设计举例第九章第九章 位运算位运算1C语言教学语言教学幻灯片版幻灯片版第九章位运算第九章位运算9.19.1位运算符与位运算位运算符与位运算位运算是指进行二进制位的运算,是位运算是指进行二进制位的运算,是C C语语言有别于其他高级语言的一种强大的运算,言有别于其他高级语言的一种强大的运算,它使得它使得C C语言具有了某些低级语言的功能,语言具有了某些低级语言的功能,主要用于系统程序或控制程序中,例如设主要用于系统程序或控制程序中,例如设备驱动程序、
2、磁盘文件管理程序等。备驱动程序、磁盘文件管理程序等。位运算与位段结构位运算与位段结构 位是指二进制数的一位,其值为位是指二进制数的一位,其值为0 0或或1 1。位段以位为单位定义结构体(或共用体)位段以位为单位定义结构体(或共用体)中成员所占存储空间的长度。中成员所占存储空间的长度。含有位段的结构体类型称为位段结构。含有位段的结构体类型称为位段结构。2C语言教学语言教学幻灯片版幻灯片版第九章位运算第九章位运算9.1.2按位取反运算符按位取反运算符9.19.1位运算符与位运算位运算符与位运算位运算符主要有:位运算符主要有:、&、|、。(按位(按位“取反取反”)运算规则为:运算规则为:0=10=1
3、,1=01=0例如,例如,77的值为的值为-8-8。在用位运算符进行数的运算时,数是以补码的形式参在用位运算符进行数的运算时,数是以补码的形式参加运算的。加运算的。9.1.1位运算符位运算符3C语言教学语言教学幻灯片版幻灯片版第九章位运算第九章位运算9.19.1位运算符与位运算位运算符与位运算(“左移左移”)运算功能:运算功能:将一个数的各个二进制位全部向将一个数的各个二进制位全部向左平移若干位,左边移出的部分予以忽略,左平移若干位,左边移出的部分予以忽略,右边空出的位置补零。右边空出的位置补零。例如,例如,323(“右移右移”)运算功能:运算功能:将一个数的各个二进制位全部向右平将一个数的各
4、个二进制位全部向右平移若干位,右边移出的部分予以忽略,左边空出移若干位,右边移出的部分予以忽略,左边空出的位置对于无符号数补零,对于有符号数,若原的位置对于无符号数补零,对于有符号数,若原符号位为符号位为0,则补,则补0,若原符号位为,若原符号位为1,则全补,则全补1。也就是右移后保持这个数的正负符号不变。也就是右移后保持这个数的正负符号不变。例如,例如,-32-32,将,将3 3右移右移2 2位,左边(最高位)位,左边(最高位)补补1 1,结果为,结果为-1-1。9.1.4右移运算符右移运算符5C语言教学语言教学幻灯片版幻灯片版第九章位运算第九章位运算&(按位(按位“与与”)运算规则:运算规
5、则:0&0=00&0=0,0&1=00&1=0,1&0=01&0=0,1&1=11&1=1例例如如,-5&3-5&3的的值值为为3 3。其其中中-5-5的的补补码码(为为简简便便起起见见,用用8 8位位二二进进制制表表示示)为为1111 1111 10111011,3 3的的补补码码为为0000 0000 00110011,按按位位与与的的结结果果为为0000 0000 00110011,即值为十进制数,即值为十进制数3 3。9.19.1位运算符与位运算位运算符与位运算9.1.5按位与运算符按位与运算符6C语言教学语言教学幻灯片版幻灯片版第九章位运算第九章位运算9.1.6按位或运算符按位或运算
6、符9.19.1位运算符与位运算位运算符与位运算9.1.7按位异或运算符按位异或运算符|(按位(按位“或或”)运算规则:运算规则:0|0=00|0=0,0|1=10|1=1,1|0=11|0=1,1|1=11|1=1例如,例如,-5|3-5|3的值为的值为-5-5。-5-5与与3 3相位或后得相位或后得1111101111111011,其真值为,其真值为-0000101-0000101,即,即-5-5。(按位(按位“异或异或”)运算规则为:运算规则为:00=000=0,01=101=1,10=110=1,11=011=0例如,例如,-53-53的值为的值为-8-8。7C语言教学语言教学幻灯片版幻
7、灯片版第九章位运算第九章位运算9.29.2位段位段9.2.1位段结构体说明位段结构体说明位段结构也是一种结构体类型,只不过其中含有以位段结构也是一种结构体类型,只不过其中含有以位为单位定义存储长度的整数类型位段成员。采用位位为单位定义存储长度的整数类型位段成员。采用位段结构既节省存储空间,又可方便操作。段结构既节省存储空间,又可方便操作。位段结构中位段的位段结构中位段的定义格式定义格式为:为:unsigned:例:例:struct bytedataunsigned a:2;/*位段位段a,占,占2位位*/unsigned:6;/*无名位段,占无名位段,占6位,但不能访问位,但不能访问*/uns
8、igned:0;/*无名位段,占无名位段,占0位,表下一位段从下一字边界开始位,表下一位段从下一字边界开始*/unsigned b:10;/*位段位段b,占,占10位位*/int i;/*成员成员i,从下一字边界开始,从下一字边界开始*/data;8C语言教学语言教学幻灯片版幻灯片版第九章位运算第九章位运算9.29.2位段位段9.2.2位段的引用位段的引用位段数据的引用,同结构体成员中的数据引用一样,但应注意位位段数据的引用,同结构体成员中的数据引用一样,但应注意位段的最大取值范围不要超出二进制位数确定的范围,否则超出部分段的最大取值范围不要超出二进制位数确定的范围,否则超出部分会丢弃。会丢弃
9、。关于位段数据,注意以下几点:关于位段数据,注意以下几点:(1)一个位段必须存储在同一存储单元(即字)之中,不能跨两)一个位段必须存储在同一存储单元(即字)之中,不能跨两个单元。如果其单元空间不够,则剩余空间不用,从下一个单元起个单元。如果其单元空间不够,则剩余空间不用,从下一个单元起存放该位段。存放该位段。(2)可以通过定义长度为)可以通过定义长度为0的位段的方式使下一位段从下一存储单的位段的方式使下一位段从下一存储单元开始。元开始。(3)可以定义无名位段。)可以定义无名位段。(4)位段的长度不能大于存储单元的长度。)位段的长度不能大于存储单元的长度。(5)位段无地址,不能对位段进行取地址运
10、算。)位段无地址,不能对位段进行取地址运算。(6)位段可以以)位段可以以%d,%o,%x格式输出。格式输出。(7)位段若出现在表达式中,将被系统自动转换成整数。)位段若出现在表达式中,将被系统自动转换成整数。例如:例如:data.adata.a=2;=2;但但 data.adata.a=10;=10;就超出范围(就超出范围(a a占占2 2位,最大位,最大3 3)9C语言教学语言教学幻灯片版幻灯片版第九章位运算第九章位运算9.39.3程序设计举例程序设计举例例例编程将一个编程将一个1616进制整数(占进制整数(占2 2字节)的各位循环左移字节)的各位循环左移4 4个二进制位,如个二进制位,如2
11、fe12fe1循环左移循环左移4 4个二进制位后为个二进制位后为fe12fe12。分析:分析:可先取出可先取出1616进制整数的最高进制整数的最高4 4个二进制位,然后将个二进制位,然后将该整数左移该整数左移4 4个二进制位,最后将先前取出的最高个二进制位,最后将先前取出的最高4 4个个二进制位放入低二进制位放入低4 4个二进制位位置。具体步骤为:个二进制位位置。具体步骤为:(1 1)取出)取出1616进制整数进制整数x x的最高的最高4 4个二进制位至个二进制位至y y:y=x(16-4)&0 xfy=x(16-4)&0 xf。(2 2)将该整数将该整数x x(占占2 2字节)左移字节)左移4 4个二进制位:个二进制位:x=(x4)&0 xffffx=(x(16-4)&0 xf;x=(x4)&0 xffff;/*16位的位的C语言程序不需要语言程序不需要“按位与按位与”0 xffff*/x=x|y;printf(“循环左移循环左移4个二进制位得:个二进制位得:%x”,x);程序运行结果如下:程序运行结果如下:请输入请输入16进制整数:进制整数:2fe1循环左移循环左移4个二进制位得:个二进制位得:fe129.39.3程序设计举例程序设计举例11
限制150内