欢迎来到天天文库
浏览记录
ID:51644279
大小:250.00 KB
页数:11页
时间:2020-03-27
《《C语言的位运算》PPT课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、9.1位运算符与位运算9.2位 段9.3程序设计举例第九章 位运算19.1位运算符与位运算位运算是指进行二进制位的运算,是C语言有别于其他高级语言的一种强大的运算,它使得C语言具有了某些低级语言的功能,主要用于系统程序或控制程序中,例如设备驱动程序、磁盘文件管理程序等。位运算与位段结构位是指二进制数的一位,其值为0或1。位段以位为单位定义结构体(或共用体)中成员所占存储空间的长度。含有位段的结构体类型称为位段结构。29.1.2按位取反运算符9.1位运算符与位运算位运算符主要有:~、<<、>>、&
2、、
3、、^。~(按位“取反”)运算规则为:~0=1,~1=0例如,~7的值为-8。在用位运算符进行数的运算时,数是以补码的形式参加运算的。9.1.1位运算符39.1位运算符与位运算<<(“左移”)运算功能:将一个数的各个二进制位全部向左平移若干位,左边移出的部分予以忽略,右边空出的位置补零。例如,3<<2,将3左移2位,右边(最低位)补0,结果为12,相当于3×2×2的结果。9.1.3左移运算符49.1位运算符与位运算>>(“右移”)运算功能:将一个数的各个二进制位全部向右平移若干位,右边移出的部
4、分予以忽略,左边空出的位置对于无符号数补零,对于有符号数,若原符号位为0,则补0,若原符号位为1,则全补1。也就是右移后保持这个数的正负符号不变。例如,-3>>2,将3右移2位,左边(最高位)补1,结果为-1。9.1.4右移运算符5&(按位“与”)运算规则:0&0=0,0&1=0,1&0=0,1&1=1例如,-5&3的值为3。其中-5的补码(为简便起见,用8位二进制表示)为11111011,3的补码为00000011,按位与的结果为00000011,即值为十进制数3。9.1位运算符与位运算9.1
5、.5按位与运算符69.1.6按位或运算符9.1位运算符与位运算9.1.7按位异或运算符
6、(按位“或”)运算规则:0
7、0=0,0
8、1=1,1
9、0=1,1
10、1=1例如,-5
11、3的值为-5。-5与3相位或后得11111011,其真值为-0000101,即-5。^(按位“异或”)运算规则为:0^0=0,0^1=1,1^0=1,1^1=0例如,-5^3的值为-8。79.2位 段9.2.1位段结构体说明位段结构也是一种结构体类型,只不过其中含有以位为单位定义存储长度的整数类型位段成员。采用位段结构既节省存储
12、空间,又可方便操作。位段结构中位段的定义格式为:unsigned<成员名>:<二进制位数>例:structbytedata{unsigneda:2;/*位段a,占2位*/unsigned:6;/*无名位段,占6位,但不能访问*/unsigned:0;/*无名位段,占0位,表下一位段从下一字边界开始*/unsignedb:10;/*位段b,占10位*/inti;/*成员i,从下一字边界开始*/}data;89.2位 段9.2.2位段的引用位段数据的引用,同结构体成员中的数据引用一样,但应注意位段的
13、最大取值范围不要超出二进制位数确定的范围,否则超出部分会丢弃。关于位段数据,注意以下几点:(1)一个位段必须存储在同一存储单元(即字)之中,不能跨两个单元。如果其单元空间不够,则剩余空间不用,从下一个单元起存放该位段。(2)可以通过定义长度为0的位段的方式使下一位段从下一存储单元开始。(3)可以定义无名位段。(4)位段的长度不能大于存储单元的长度。(5)位段无地址,不能对位段进行取地址运算。(6)位段可以以%d,%o,%x格式输出。(7)位段若出现在表达式中,将被系统自动转换成整数。例如:dat
14、a.a=2;但data.a=10;就超出范围(a占2位,最大3)99.3程序设计举例例编程将一个16进制整数(占2字节)的各位循环左移4个二进制位,如2fe1循环左移4个二进制位后为fe12。分析:可先取出16进制整数的最高4个二进制位,然后将该整数左移4个二进制位,最后将先前取出的最高4个二进制位放入低4个二进制位位置。具体步骤为:(1)取出16进制整数x的最高4个二进制位至y:y=x>>(16-4)&0xf。(2)将该整数x(占2字节)左移4个二进制位:x=(x<<4)&0xffff。(3)
15、将先前取出的最高4个二进制位放入低4个二进制位:x=x
16、y。10#include“stdio.h”main(){intx,y;printf(“请输入16进制整数:”);scanf(“%x”,&x);y=x>>(16-4)&0xf;x=(x<<4)&0xffff;/*16位的C语言程序不需要“按位与”0xffff*/x=x
17、y;printf(“循环左移4个二进制位得:%x”,x);}程序运行结果如下:请输入16进制整数:2fe1循环左移4个二进制位得:fe129.3程序设计举例11
此文档下载收益归作者所有