- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
北京邮电大学出版社 第12章 位运算 12.1 位运算符和位运算 12.2 位运算举例 12.3 位段 本章小结 北京邮电大学出版社 12.1 位运算符和位运算 所谓位运算是指进行二进制位的运算。与其它高级语言相比,C语言中具有低级语言的功能表现在: 1.具有系统调用的功能;例如调用系统功能的bdos( ),intdos( )等函数;读写I/O端口的函数inportb( )和outportb( )等等。 2.具有直接对C中的int和char类型的数据的某些字节或位进行操作的能力;例如将一个存储单元中的各二进制位左移或右移一位,两个数按位相加等。C语言提供了如表12.1所列出的位运算符。 北京邮电大学出版社 表12.1 位运算符 运算符 含义 举例 按位与 ab,a和b中各位按位进行“与”运算 | 按位或 a|b,a和b中各位按位进行“或”运算 ^ 按位异或 a^b,a和b中各位按位进行“异或”运算 ~ 取反 ~a,a中各位按位进行“取反”运算 左移 an,a中各位全部左移n位 右移 an,a中各位全部右移n位 北京邮电大学出版社 12.2 位运算举例 例12.7 有一数据b,想测试其第4位是否为1? 分析: 1.位号是从右向左数,最右一位为第0位 2.将一个二进制b进行运算,如果结果则第4位为1;否则结果则第4位为0。 程序代码: main( ) {int a , b ; a=8 scanf(“%d”,b); printf(“%d”,ab);} 7 6 5 4 3 2 1 0 北京邮电大学出版社 例12.8 一个整数a从右开始的4~7位,比如,0000,0000,1101,1001(八进制331/十进制217,4~7位1101的八进制值是15/十进制13) 分析: 1.先使a移4位,使要取出的几位移到最右端,a4 2.设置一个低4位全为1,其余为0的数 3.将上面两者进行运算 北京邮电大学出版社 程序代码: main() { unsigned a,b,c,d; scanf(“%o”,a); b=a4; c=~(~04); d=bc; printf(“%d\n%o\n”,a,b); } 北京邮电大学出版社 例12.9 将a进行循环右移,如原来右端3位移到最左端3位 如1101111110101011---------?0111101111110101 注意:不能直接使用运算符,因为运算符使左面添0或添1。 分析:设需要循环右移的数是一个整数(两字节),要移动n位。 1.a的右端n位先放在中间变量b的高n位(左移16-n位) b=a(16-n); 2.将a右移n位,其左端高位n位补0。 c=an; 3.将c与b进行按位或运算。 c=c|b; 北京邮电大学出版社 程序代码: main() { unsigned a,b,c; int n; scanf(“a=%d,n=%d”,a,n); b=a(16-n); c=an; c=c|b; printf(“%o\n%o”,a,c); } 北京邮电大学出版社 12.3 位段 C语言可以用以上介绍的位运算访问位(bit),也可以用“位段”的方法来访问字节中某些位。位段(bit field)又可以称为“位域”,“位字段”等,实际上它是字节中一 些位的组合,因此也可认为它是“位信息组”。 位段是一种特殊形式的结构体结构中的成员,它与以前介绍过的结构体有不同之处在于它是以位为单位来定义结构中的成员的长度。 北京邮电大学出版社 Struct packed_datal { unsigned int a:3; /*占3个二进制位*/ unsigned int b:1; /*占1个二进制位*/ unsigned int c:3; /*占3个二进制位*/ unsigned int d:1; /*占1个二进制位*/ }data; 对位段的引用方法与引用结构体变量中的成员相同,即用以下形式: data.a, data.b, data.c, data,d 北京邮电大学出版社 允许对位段赋值,例如: data.a=7; data.b=1; data.c=5; data.d=0; 要注意每一个位段能存储的最大值。例如data.a占三位,最大值为7,如果赋以10就会出现溢出,从而使data.c只取10的二进制数的低3位(010
文档评论(0)