第12章位运算_第1页
第12章位运算_第2页
第12章位运算_第3页
第12章位运算_第4页
第12章位运算_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言程序设计语言程序设计第第1212章章 位运算位运算秦丹阳秦丹阳黑龙江大学电子工程学院黑龙江大学电子工程学院通信工程系通信工程系TEL: 86608943E-mail: 0000 00001 10010 20011 30100 40101 50110 60111 71000 81001 91010 A1011 B1100 C1101 D1110 E1111 F000 0001 1010 2011 3100 4101 5110 6111 70000 00001 10010 20011 30100 40101 50110 60111 71000 81001 9二二十进制十进制二二八进制八进制二

2、二十六进制十六进制主要内容主要内容12.1 位运算符和位运算位运算符和位运算12.2 位运算举例位运算举例12.3 位段位段相关概念相关概念位运算位运算是指按二进制位进行的运算。因为在系统软件中,常要处理二进制位的问题例如:将一个存储单元中的各二进制位左移或右移一位,两个数按位相加。语言提供位运算的功能,与其他高级语言(如PASCAL)相比,具有很大的优越性语言提供的位运算符有语言提供的位运算符有:说明:说明:(1)位运算符中除以外,均为二目(元)运算符,即要求两侧各有一个运算量。(2)运算量只能是整型或字符型的数据,不能为实型数据。(3)优先级别:、 、 &、 、 |(高-低)运算符含义按位

3、与按位或按位异或|运算符含义取反左移右移定义定义:参加运算的两个数据,按二进制位进行 “与”运算。符号符号:规则规则:如果两个相应的二进制位都为,则该位的结果值为;否则为。即:注意:注意:如果参加 & 运算的是负数,则要以补码形式表示为二进制数,然后再按位进行“与”运算。例:例: 00000011 (3)& 00000101 (5) 00000001 (1)3&5的值得用途:用途: 找一个二进制数,条件:原来的数中为的位,新数中相应位为。然后使二者进行运算,即可达到清零目的。与一个数进行运算,此数在该位取,其它位取0。:若要对指定位清0,则用0与之相与;某些位保持不变,则用1与之相与。例:原有

4、数为,另找一个数为,将这两个数进行运算: & & 例:有一个整数(个字节),想要取其中的低字节例:有一个整数(个字节),想要取其中的低字节0 0 1 0 1 1 0 0 1 0 1 0 1 1 0 00 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0a a & 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 & 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1b b 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 c c例:有一数,想把其中左面第、位保留下来,运算如下: (

5、84)(84)& & (59)(59) (16)(16)例:有一个整数(个字节),想要取其中的高字节例:有一个整数(个字节),想要取其中的高字节0 0 1 0 1 1 0 0 1 0 1 0 1 1 0 00 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0a a & 1 1 1 1 1 1 1 1 & 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 b 0 0 0 0 0 0 0 0 b 0 0 1 0 1 1 0 00 0 1 0 1 1 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 c c规则:规则:两个相应的二进制位中只要有一个为,该位

6、的结果值为。即: | | |用途用途:常用来对一个数据的某些位定值为。例:例:060|017,060|017,将八进制数将八进制数6060与八与八进制数进制数1717进行按位或运算。进行按位或运算。 0 0 1 1 0 0 0 00 0 1 1 0 0 0 0| 0 0 0 0 1 1 1 1| 0 0 0 0 1 1 1 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1例:使一个单元的低位改为,只需将其与例:使一个单元的低位改为,只需将其与0000111100001111进行按位或运算即可。进行按位或运算即可。 | | 0 0 0 0 1 1 1 10 0 0 0 1 1

7、1 1- 1 1 1 11 1 1 1 例例: :是一个整数(位)是一个整数(位)有表达式:有表达式: | | | | 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 10 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1即低位全置为,高位保留原样。即低位全置为,高位保留原样。异或运算符也称 XOR运算符。规则规则:参加运算的两个二进制位同号则结果为(假);异号则结果为(真) 即:00=0,01=1,10=1,11=0用途:用途:()使特定位翻转使特定位翻转原数中值为1的位与1进行运算得0,原数中的位值0与1进

8、行运算的结果得1.() 与相与相 ,保留原值保留原值因为原数中的与进行 运算得, 得,故保留原数 。() 交换两个值,不用临时变量交换两个值,不用临时变量例:例:0 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1 十进制数十进制数5757,八进制数,八进制数071071 0 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 十进制数十进制数4242,八进制数,八进制数052052 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 1 十进制数十进制数1919,八进制数,八进制数023023即:即:071052=023 071052=023 (八进制数)(八进制数

9、)设有,想使其低位翻转,即设有,想使其低位翻转,即变为,变为。变为,变为。可以将它与进行可以将它与进行 运算,运算,即:即: 运算结果的低位正好是原数低位的翻转。可运算结果的低位正好是原数低位的翻转。可见,要使哪几位翻转就将与其进行见,要使哪几位翻转就将与其进行 运算的该运算的该几位置为即可。几位置为即可。例如例如,012 00=012,012 00=012 0 0 0 0 1 0 1 00 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 00 0 0 0 1 0 1 0例如:例如:, , 。想将和的值互换想将和的值互换,

10、 ,可以用以下赋值语句实现:可以用以下赋值语句实现: ab ;ab ; ba ;ba ; ab ;ab ; ( ) (结果(结果,a,a已变成)已变成)( ) ( 结果结果,b,b已变成已变成 )( ) ( 结果结果,a,a已变成已变成 )即等效于以下两步:即等效于以下两步: 执行前两个赋值语句:相当于执行前两个赋值语句:相当于 b=b(ab) b=b(ab) 。 再执行第三个赋值语句,再执行第三个赋值语句, 由于由于 a a的值等于的值等于 ( ),b,b的值等于的值等于 ( ), ,因此因此, ,相相当于当于 a=a= , ,即即 a a的值等于的值等于 , ,等于等于 。得到原来的值得到

11、原来的值 。规则规则:是一个单目(元)运算符,用来对一个二进制数按位取反,即将变,将变 。 例如:是对八进制数 ( 即二进制数 ) 按位求反 。0000000000010101( )1111111111101010 ( (八进制数八进制数 177752)177752)规则规则:将一个数的各二进制位全部左移若干位。用途用途:左移位相当于该数乘以,左移位相当于该数乘以 22注意:注意:此结论只适用于该数左移时被溢出舍弃的高位只适用于该数左移时被溢出舍弃的高位中不包含的情况中不包含的情况。 假设以一个字节(位)存一个整数,若为无符号整型变量,则时,左移一位时溢出的是,而左移位时,溢出的高位中包含。例

12、如例如,a=a2 ,a=a2a2表示将表示将a a的各二进制位右移的各二进制位右移 2 2位,移到右端的位,移到右端的低位被舍弃低位被舍弃, ,对无符号数对无符号数, ,高位补高位补 0 0。例:例:a=017a=017,a a的值用二进制形式表示为的值用二进制形式表示为 0000111100001111 a2=00000011 a2=00000011(舍弃低(舍弃低2 2位位1111)例:例:a a的值是八进制数的值是八进制数 113755113755:a:1001011111101101 a:1001011111101101 (用二进制形式表示)(用二进制形式表示)a1,010010111

13、1110110 (a1,0100101111110110 (逻辑右移时逻辑右移时 ) )a1,1100101111110110 (a1,1100101111110110 (算术右移时算术右移时 ) )右移一位相当于除以右移一位相当于除以2 2 右移右移n n位相当于除以位相当于除以2n2n。 位运算符与赋值运算符可以组成复合赋值运算符。例如,&=,|=,=,=,=例: a & = b相当于 a = a & b a =2相当于a = a 4,a 4 目的是使要取出的那几位移到最右端未未右移时的情况 右移4位后的情况 例1: 取一个整数a从右端开始的 47位与低与低4 4位为位为1 1的数进行的数

14、进行& &运算,就能将这运算,就能将这4 4位保留下来位保留下来步骤:步骤: 设置一个低4位全为1,其余全为0的数。 ( (0 4 ) 0 4) & (a 4) & ( (04 )04 )程序如下:#include void main() unsigned a,b,c,d;scanf(“%o”,&a);b=a4;c= ( 04);d=b&c;printf(“%o,%dn%o,%dn”,a,a,d,d);输入的值为八进制数 331,其二进制形式为 11011001经运算最后得到的 d为 00001101即八进制数,十进制数 13。输入:输入:331331运行结果:运行结果:331,217 331

15、,217 (的值)(的值)15,13 15,13 (的值)(的值)例2 循环移位。要求将进行右循环移位,将右循环移位,即将中原来左面()位右移位,原来右端位移到最左面位。步骤: 将的右端位先放到中的高位中,实现语句:()(); 将右移位,其左面高位位补,实现语句:; 将与进行按位或运算,即|;程序如下:#include void main() unsigned a,b,c;int n;scanf(“a=%o,n=%d”,&a,&n);b=an;c=c|b;printf(“%on%o”,a,c);输入:输入:,运行结果:运行结果: 3 3运行开始时输入八进制数运行开始时输入八进制数1576531

16、57653,即二进制数即二进制数11011111101010111101111110101011循环右移位后得二进制数循环右移位后得二进制数01111011111101010111101111110101即八进制数即八进制数75765757651、以下不能将变量、以下不能将变量m清零的表达式是清零的表达式是_A) m = m & m B) m = m & 0C) m = m mD) m = m | m2、设有以下语句、设有以下语句char x=3,y=6,z;z=xy2;则则z的二进制值是的二进制值是_A) 00010100 B) 00011011C) 00011100D) 00011000有

17、以下程序:有以下程序:#include void main( ) unsigned char a,b; a = 5 | 4; b = 5 & 4; printf(“%d,%dn”,a,b);程序执行时的输出结果是程序执行时的输出结果是_ 信息的存取一般以字节为单位。实际上,有时存储一个信息不必用一个或多个字节,例如,“真”或“假”用或表示,只需位即可。在计算机用于过程控制、参数检测或数据通信领域时,控制信息往往只占一个字节中的一个或几个二进制位,常常在一个字节中放几个信息。 怎样向一个字节中的一个或几个二进制位赋值怎样向一个字节中的一个或几个二进制位赋值和改变它的值呢和改变它的值呢?可以用以下

18、两种方法:(1)可以人为地将一个整型变量data分为几部分。 但是用这种方法给一个字节中某几位赋值太麻烦。可以位段结构体的方法。 (2)位段 C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域” (bit field)。利用位段能够用较少的位数存储数据。 程序如下:struct packed-data unsigned :; unsigned:; unsigned:; unsigned:; int ; data; 关于位段的定义和引用的说明:(1)位段成员的类型必须指定为unsigned或int类型。(2)若某一位段要从另一个字开始存放,可用以下形式定义:unsigned :1;unsignedb:;一个存储单元 unsigned:;unsigned:;另一存储单元 a、b、c应连续

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论