电子课件第10章

上传人:w****i 文档编号:94404909 上传时间:2019-08-06 格式:PPT 页数:34 大小:474.50KB
返回 下载 相关 举报
电子课件第10章_第1页
第1页 / 共34页
电子课件第10章_第2页
第2页 / 共34页
电子课件第10章_第3页
第3页 / 共34页
电子课件第10章_第4页
第4页 / 共34页
电子课件第10章_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《电子课件第10章》由会员分享,可在线阅读,更多相关《电子课件第10章(34页珍藏版)》请在金锄头文库上搜索。

1、第10章 位运算,1,第10章 位运算,位运算是指对二进制形式的整型数据的各位逐位进行逻辑运算的操作。 位运算的重要性 中断字的某个中断位置0或置1 表示与设置设备的状态 表示与设置文件的属性 。 位运算是C语言区别于许多其他计算机高级程序设计语言的显著特性之一 。 C语言中对二进位的操作的两个途径 位运算符 位字段,2,主要内容,10.1 位运算符 10.2 位段,10.1 位运算符,10.1.1 位逻辑运算符 10.1.2 移位运算符 10.1.3 位运算应用实例,10.1 位运算符,& 位与 双目 位逻辑运算符类 | 位或 双目 位异或 双目 位取反 单目 右移 双目,C语言中的位运算符

2、,10.1 位运算符,运算优先级 逻辑运算符 = = =,C语言中的位运算符,10.1.1 位逻辑运算符,位逻辑运算符的运算规则,10.1.1 位逻辑运算符,位逻辑运算符与逻辑运算符的区别 多位二进制的位逻辑运算按参与运算的操作数的存储形式逐位进行相应运算 x的值: 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 y的值:0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 x&y : 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0,10.1.1 位逻辑运算符,操作数的符号位也参与运算,运算结果的符号位并不按算术规则确定。 #include int m

3、ain(void) int a=0x800f, b; /* a 是一个负数 */ b=a 程序的输出为正整数12,10.1.1 位逻辑运算符,使某个整型变量对应的存储单元清0 val&=0; 使某个整型变量指定的某些二进位清0 用&运算来查看某个二进位的值 if (flag&MASK)=MASK),位与运算符 &,10.1.1 位逻辑运算符,截取(或析出)整型变量的指定的二进位,并使其他不相关的位清0。 例:假定变量的存储长度为16个二进位,并假定要析取出int型变量a(其值为OxF93)的第 47位(从右往左数,从0开始计数),且其余位清0。 0xF93 0 0 0 0 1 1 1 1 1

4、0 0 1 0 0 1 1 (变量a) 0360 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 (工作常数) a&0360 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0,位与运算符 &,10.1.1 位逻辑运算符,| 运算常用来将一个整型数据的指定的二进制位置1,而不管原来那个二进制位的状态如何。 例:假定int型变量a的值为 055555,如果要将该变量对应的存储单元的最高位置为1,只要计算 a |= 0x8000。 055555 0 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 (变量a) 0x8000 1 0 0 0 0 0 0 0 0

5、0 0 0 0 0 0 0 (常数) a |=0x8000 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1,位或运算符 |,10.1.1 位逻辑运算符,当且仅当参加运算的两个操作数对应的二进位的状态不同时才将对应的二进位置为1。 例:假定a的内容为0x0F,则 0x0F 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 (变量a) 0x18 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 (常数) a=0x18 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 程序设计中常用“按位加”运算以如下方法来实现两个变量内容的互换: x=xy

6、; y=yx; x=xy;,位异或运算符 ,10.1.1 位逻辑运算符,对给定的操作数的各个二进位逐位求反。 对同一个操作数连续执行两次“位取反”操作其结果必定与原操作数相同。 x&077的含义: 取变量x的低6位以前的部分,并使结果的低6位全为0。,位取反运算符 ,10.1.2 移位运算符,移位操作是对二进制形式的数据以二进位为单位向左或向右移动指定的若干位。被移动的操作数可以是有符号或无符号整型数。 一般形式: mn mn m是被移位的操作数。n是数据移位的位数。 m和n都为整型表达式。 移位运算结果的类型取决于m的类型。,10.1.2 移位运算符,执行左移操作时操作数左端移出的高位部分丢

7、弃,右端空出的低位补以0。 执行右移操作时操作数右端移出的低位丢弃,对于左端空出位的补位情况: 无符号数的右移,左端空出的高位一律补以0; 有符号数的右移,移位时连同符号位一起移位,对左端空出的高位的补位情况: 一些C编译系统将全部填以符号位的内容(算术移位) 一些编译系统中则全部填以0(逻辑移位)。,10.1.2 移位运算符,char型数据的移位。 假定字符变量r中存储了字符A,其存储形式是 01000001。若执行: r3 则计算过程如下,10.1.2 移位运算符,int型数据的移位。 假定int型变量v中保存的数值为-16,即: v: 1111111111110000 执行v2 操作后得

8、到: 1111111111111100 (按算术移位处理的情况) 0011111111111100 (按逻辑移位处理的情况),10.1.2 移位运算符,无符号整数的移位。假定无符号int型变量u中存放了无符号整数49153,即: u: 1100000000000001 对其执行u5操作后得到: 0000011000000000 “移动位数” 一般应为正整数值,如果其值大于被移位操作数的存储位数,或为负值(事实上总是将其看作为无符号数),则移位结果不定。,10.1.2 移位运算符,例:假定x、p、n都为无符号整型量,则表达式xp+1n&(0 n)的求值顺序如何?其结果是什么?,10.1.3 位运

9、算应用实例,例10.1 把一个十进制整数转换成字符串形式的、原码表示的二进制数。 char *itob(int i) int j=15; static char b17; if(i= 1,j= 0; ); return b; ,10.2 位段,10.2.1 位段结构 10.2.2 位段结构应用实例,10.2.1 位段结构,一个位段是一个机器字中的若干连续的二进位。 C允许定义位段结构,即以位段为单位定义结构类型中的诸成员(member)。 struct 位段结构名 数据类型1 位段名1: 位段长度1; 数据类型2 位段名2: 位段长度2; 数据类型n 位段名n: 位段长度n; ;,10.2.1

10、 位段结构,“位段结构名” 规定了位段结构的名字。与一般的结构定义类似,也允许定义无名位段结构。 “数据类型i” 用来指出其后的“位段名i ”中存放何种类型的数据,它们只能为int、unsigned int、signed int、char、和_bool类型。 “位段名i” 规定了位段i的名字。注意,其后的冒号(:)不能漏写。“位段名i”可以缺省(为空),但其后的冒号不能省略,这样的位段称之为无名位段。,10.2.1 位段结构,“位段长度i” 就是相应的“位段名i”所占用的二进位位数。在无名位段情况下,如果“位段长度i”为n ,若n0,表示从当前位置开始的n个二进制位不用(无定义);若n=0,则

11、表示下一个位段要从下一个新字的开始安排(即0长度的无名位段将导致跳过当前字中剩余的位)。 位段结构的各个位段在机器字中的安排方向随计算机的不同而不同,有些计算机是从机器字的右边往左安排,而有些计算机则是从左往右安排 。,10.2.1 位段结构,struct unsigned int bf1: 3; unsigned int : 2; unsigned int bf2: 2; unsigned int : 0; unsigned int bf3: 5; strubf;,10.2.1 位段结构,(1) 一个位段必须完全包含在一个机器字中,不能跨机器字存放。若当前的机器字中剩下未分配的二进位数少于下

12、一个位段的长度,则剩下的这些二进位不用,而把下一个位段安排到下一个机器字中去。 struct exm unsigned bw1: 6; signed bw2: 3; int bw3: 5; unsigned bw4: 7; ;,对位段结构的说明,10.2.1 位段结构,(2) 在定义一个位段结构时,若其中定义的位段名被指定为int或signed数据类型,那么,其位段长度必须大于1,因为存放在这样的位段中的数据必须使用一位符号位。 (3) 一旦定义了一个位段结构数据类型,便可定义该数据类型的变量,然后便能存取该结构变量中的位段成员。,对位段结构的说明,10.2.1 位段结构,(4) 位段结构变量

13、中的每一个位段成员都可以像普通变量一样参于各种表达式运算,也可以向它赋值。 struct exm fbus, *p= fbus.bw1=2; p-bw2=3; fbus.bw3=fbus.bw1+p-bw2 if(fbus.bw3=0&fbus.bw1!=2) ,对位段结构的说明,10.2.1 位段结构,(5) 因一个位段仅是一个机器字中的若干个二进位,对它们来说无任何地址可言,所以在程序设计中不能对它们执行取地址的操作。 (6)位段结构的成员不能是位段数组,但是允许定义位段结构型数组。,对位段结构的说明,struct error unsigned int m1: 5; int array5:

14、 3 ; ; 不允许,struct exm signed bw1: 3; int array: 5; fbus5; 允许,10.2.1 位段结构,(7) C允许在结构或位段结构中混合定义普通成员与位段成员。 struct mix char name20; unsigned year: 12; unsigned month: 4; unsigned day : 5; unsigned sex : 1; person;,对位段结构的说明,10.2.1 位段结构,(8) 不同机器以及编译系统位段结构变量的存储单元分配机制不同,通常以 unsigned int 变量的存储长度为基本分配单位。 (9)声

15、明位段结构类型变量时,也可以指定其初始化值。,对位段结构的说明,10.2.2 位段结构应用实例,例10.2 一个记录、检查、修改、并输出微机系统中的设备配置情况的模拟程序。 假定某微机系统接入设备情况用16位二进位来记录,其各位定义见下图。其中,1表示“有”、0表示“无”、RAM大小以64MB为单位、Cache大小以256KB为单位 、设备从0到9编号。,10.2.2 位段结构应用实例,位段结构定义如下: typedef struct unsigned usb : 1; unsigned modem : 1; unsigned soundadapter : 1; unsigned printers : 2; unsigned disks : 2; unsigned ramsize : 3; unsigned chechsize : 3; unsigned cddriveadapter : 1; unsigned videoadapter : 1; unsigned gameadapter : 1; CONFIG;,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号