第十二章计算机.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十二章计算机

第十二章 位运算 前面介绍的各种运算都是以字节作为最基本位进行的。但在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。 所谓位运算是指进行二进制位的运算。 12.1 位运算符和位运算 1.按位与── ⑴格式:xy ⑵规则:对应位均为1时才为1,否则为0。 例如:39=1 0011 ??? ??? ??1001 ???????? ?0001 = 1 ⑶主要用途:取(或保留)1个数的某(些)位,其余各位置0。 a:001001000101 581 b:000000001111 15 c:000000000101 5 2.按位或──| ⑴格式:x|y ⑵规则:对应位均为0时才为0,否则为1。 例如:3|9=11: 0011? |??1001? ??????????????? 1011 = 11 ⑶主要用途:将1个数的某(些)位置1,其余各位不变。 a:001001000101 581 b:000000001111 15 d:001001001111 591 3.按位异或── ^ ⑴格式:x^y ⑵规则:对应位相同时为0,不同时为1。 ⑶主要用途:使1个数的某(些)位翻转,即原来为1的位变为0,为0的变为1,其余各位不变。 a:001001000101 581 b:000000001111 15 e:001001001010 586(使低4位进行了翻转) ll1.c 交换2个变量不使用临时变量 如:a=5,b=6; a=a^b; b=b^a; a=a^b; a ^b a^b b^a4.按位取反── ~ ⑴格式:~x ⑵规则:各位翻转,即原来为1的位变成0,原来为0的位变成1。 ⑶主要用途:间接地构造一个数,以增强程序的可移植性。 例如: 将一个数的最后一位设置为0在不同计算机上数字所占的内存空间大小不同。 如16位计算机:a=a0177776可以实现 在32位计算机上则无法实现故可以写为a=a~1 5.按位左移── ⑴格式:x 位数 ⑵规则:使操作数的各位左移,低位补0,高位溢出。 例如:52 000001012 == 20 ? 6.按位右移── ⑴格式:x位数 ⑵规则:使操作数的各位向右移,移出的低位舍弃;高位:①对无符号数和有符号中的正数,补0; ②负数取决于所使用的系统:补0的称为“逻辑右移”,补1的称为“算术右移”。 例如:20 2=5。 w1.c 7.对于位运算的说明 ⑴x、y和“位数”等操作数,都只能是整型或字符型数据。除按位取反为单目运算符外,其余均为双目运算符。 ⑵参与运算时,操作数x和y,都必须首先转换成二进制形式,然后再执行相应的按位运算。 ⑶实现 、|、^运算主要用途的方法: ①构造1个整数:该数在要取(或保留)的位、或要置1的位、或要翻转的位上为1,其余均为0。 ②进行相应的位运算。 ⑷实现按位取反主要用途的方法: ①求~0,间接地构造一个全1的数。 ②按需要进行左移或右移操作,构造出所需要的数。 12.2 位运算举例 例1:从键盘上输入1个正整数,输出由8~11位构成的数(从低位、0号开始编号)。 例2:从键盘上输入1个正整数,按二进制位输出该数。 12.3 位段? 有时存储1个信息不必占用1个字节,只需二进制的1个(或多个)位就够用。如果仍然使用结构类型,会造成内存空间的浪费。为此,C语言引入了位段。 1.位段的概念与定义 C语言中允许在一个结构体中以位为单位来指定其成员所占的内存长度,这种以位为单位的成员称为“位段”或“位域”。 例如,CPU的状态寄存器,按位段类型定义如下: struct status ??{ unsigned sign:? 1;? ??? /*符号标志*/ ????unsigned zero:? 1;? /*零标志*/ ????unsigned carry:? 1;? ? /*进位标志*/ ????unsigned parity:?1;? ? /*奇偶/溢出标志*/ ????unsigned half_carry: 1;? ? /*半进位标志*/ ????unsigned negative:?1; ???? /*减标志*/ ?? } flags; 显然,对CPU的状态寄存器而言,使用位段类型(仅需1个字节),比使用结构类型(需要6个字节)节省了5个字节。 2.说明 ⑴ 位段成员的类型必须是unsigned或int型。 ⑵ 使用长度为0的无名位段,可使其后续位段从下1个字节

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档