《第09章 位运算.ppt》由会员分享,可在线阅读,更多相关《第09章 位运算.ppt(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、9.1 位运算的概念位运算的概念9.2 位运算位运算9.3 位段简介位段简介C语言具有语言具有汇编语言汇编语言所能完成的一些功能,这是所能完成的一些功能,这是C语言的重要特色。语言的重要特色。在计算机用于检测控制领域中要用到在计算机用于检测控制领域中要用到位运算位运算,因此要学习和掌握本章内容。,因此要学习和掌握本章内容。9.1 位运算的概念位运算的概念 位运算位运算 进行进行二进制二进制位位的运算的运算。C 语言提供的位运算符如下表。语言提供的位运算符如下表。运运 算算 符符 含含 义义&按位按位与与|按位按位或或 按位按位异或异或(一目运算符)(一目运算符)按位按位取反取反 右移右移运算符
2、运算符第十二章第十二章 位运算位运算说明:说明:位运算符中除了位运算符中除了 以外,均为二目(元)运算符,即要求以外,均为二目(元)运算符,即要求两侧各有一个运算量。两侧各有一个运算量。运算量运算量只能是只能是整型或字符型整型或字符型数据,不能为实型数据数据,不能为实型数据。9.2.1 “按位与按位与”运算符运算符(&)参与运算的两个数据,按二进制参与运算的两个数据,按二进制位位进行进行“与与”运算。运算。运算规则运算规则:相应位都为相应位都为1 时,该位相与的结果为时,该位相与的结果为1,否则为,否则为0,即,即 0&0=0 1&0=0 0&1=0 1&1=1 例如:例如:3&5 3=0 0
3、 0 0 0 0 1 1&5=0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 值为值为1 例如:例如:(-3)&(-5)先用补码表示,然后运算。先用补码表示,然后运算。(-3)=1 1 1 1 1 1 0 1&(-5)=1 1 1 1 1 0 1 1 1 1 1 1 1 0 0 19.2 位运算位运算 用途用途:清零:用清零:用 0 去去“与与”某一位,使某一位,使该位清零该位清零。如想将一个单元清零,即如想将一个单元清零,即使其全部二进制位为使其全部二进制位为0,只要找一个二进制数,其中各个位符合以下条件:,只要找一个二进制数,其中各个位符合以下条件:原来数中为原来数中为1
4、的位,新数中相应位为的位,新数中相应位为0,然后使二者进行,然后使二者进行&运算运算 即可。即可。例如:使低例如:使低4 位为位为01 1 0 1 1 0 0 1&1 1 1 1 0 0 0 01 1 0 1 0 0 0 0 低低4位为位为0 保留一个数中的某些位。用保留一个数中的某些位。用 1 去去“与与”某一位,某一位,保留该位保留该位。如:保留低如:保留低4位位1 0 1 0 1 1 0 0&0 0 0 0 1 1 1 10 0 0 0 1 1 0 0 保留低保留低4位位 保留其中某些位,将它与这些位为保留其中某些位,将它与这些位为1 的数作的数作“与与”运算。运算。例如:有一数例如:有
5、一数01010100,想保留其左起的第,想保留其左起的第 3、4、5、7、8 位,位,0 1 0 1 0 1 0 0&0 0 1 1 1 0 1 10 0 0 1 0 0 0 0计算机中的控制字各个位表示某些设备的状态,状态发生变化,各个位计算机中的控制字各个位表示某些设备的状态,状态发生变化,各个位通过通过位运算位运算改变数值。改变数值。9.2.2 按位或运算符(按位或运算符(|)两个数的相应位两个数的相应位按位或按位或(1)运算规则:运算规则:相应位只要有一个为相应位只要有一个为1,该位相或的结果就为,该位相或的结果就为1,否则为,否则为0,即即 0|0=0 1|0=1 0|1=1 1|1
6、=1例如:例如:1 1 0 1 1 0 0 1|0 0 0 0 1 1 1 11 1 0 1 1 1 1 1(2)用途:用途:用用 1去与某些位去与某些位“或或”,使某些位为使某些位为 1。例如:。例如:1 1 0 1 1 0 0 1|0 0 0 0 1 1 1 11 1 0 1 1 1 1 1 低低 4 位为位为 1 用用 0去与某些位去与某些位“或或”,保留原位保留原位。例如:上例中例如:上例中 前前4 位保留原位位保留原位9.2.3 按位异或运算符(按位异或运算符()两个数的相应位按位异或两个数的相应位按位异或 异或异或 判断两个相应的位值是否为判断两个相应的位值是否为异异,异异则结果为
7、则结果为1,否则为,否则为0 运算规则运算规则 :相应位的位值不同时(相异),相应位的位值不同时(相异),作作或或 的运算。的运算。即即 0 0=0 1 0=1 0 1=1 1 1=0 例如:例如:1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 11 1 0 1 0 1 1 0 用途用途:用用 1 去与某些位去与某些位“异或异或”,使,使 特定位翻转。特定位翻转。0 1 1 1 1 0 1 0 0 0 0 0 1 1 1 10 1 1 1 0 1 0 1 用用 0 去与某些位异或去与某些位异或,保留原值。保留原值。如如上例中前上例中前 4 位用位用 0去异或,保留原值去异或,保留原
8、值 0111 交换两个值交换两个值,不用临时变量。,不用临时变量。例如例如:a=a b;b=b a;a=a b;假设假设a=011,b=100.请验证上述式子。请验证上述式子。b=b (a b)=b a b=a b b=aa=(a b)a=a b a=b a a=b对一个二进制数对一个二进制数按位取反按位取反 (0 1,1 0)。例如例如:0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0又如又如:若一个整数若一个整数 a 为为16 位,要使位,要使 a 最低一位为最低一位为 0,可以用,可以用a=a&0177776;(常量与常量与 a 的字长有关的字长有关)八进制数八进制数 17
9、7776 即二进制数即二进制数 1111111111111110,适于,适于16位计算机系统,对于位计算机系统,对于32位计算机系统,常量则应该用位计算机系统,常量则应该用037777777776(八进制),这样改动移植性(八进制),这样改动移植性差。最好是用表达式:差。最好是用表达式:a=a&1;(与与 a 的字长无关)的字长无关)其中:其中:1=(0000000000000001)=1111111111111110或或a=a&(a-1);若若 a=0 0 0 1 1 0 1 1&a-1=0 0 0 1 1 0 1 0 0 0 0 1 1 0 1 09.2.4 按位按位“取反取反”运算符(运
10、算符()运算符的优先级别比算术运运算符的优先级别比算术运算符、关系运算符、逻辑运算算符、关系运算符、逻辑运算符和其它位运算符都高。符和其它位运算符都高。将一个二进制数的各位全部左移若干位,将一个二进制数的各位全部左移若干位,右端空位补右端空位补0,高位左移后溢出,高位左移后溢出,舍去不起作用。舍去不起作用。例如例如:a=a 2;(左移二位左移二位)若若 a=15,a 二进制数为二进制数为 0 0 0 0 1 1 1 1 a 左移左移2 位为位为 0 0 1 1 1 1 0 0 其值为其值为 60。左移左移2 位位 相当于相当于 乘以乘以 22=4,但此结论但此结论只适用于左移时被溢出舍弃的高位
11、中只适用于左移时被溢出舍弃的高位中不包含不包含1 的情况。的情况。(见下表)a 的值的值a 的二进制形式的二进制形式a 1a264010000000 1000000001 00000000127011111110 1111111001 11111100 左移比乘法运算速度快得多,有些左移比乘法运算速度快得多,有些C 编译程序自动将乘编译程序自动将乘 2 的运的运算用左移一位来实现,将乘算用左移一位来实现,将乘 2n 的幂运算处理为左移的幂运算处理为左移 n 位。位。9.2.5 =,=2 相当于相当于a=a29.2.6 (右移运算符)(右移运算符)将一个二进制数的各位全部右移若干位,移到右端的低
12、位被舍去。将一个二进制数的各位全部右移若干位,移到右端的低位被舍去。无符号数无符号数,高位补高位补0。有符号数有符号数,正数正数(符号位为(符号位为0)左边移入)左边移入0,负数负数则取决于所用的计算机系统,有则取决于所用的计算机系统,有“逻辑右移逻辑右移”(移入(移入0)和)和“算术右移算术右移”(正数移入(正数移入0,负数移入负数移入1),称为),称为符号位扩张符号位扩张。(Turbo C 采用算术右移)例如:例如:a=a 2;(右移二位右移二位),若若 a=016 a 二进制数为二进制数为 0 0 0 0 1 1 1 0,a 右移二位为右移二位为 0 0 0 0 0 0 1 1 a:10
13、01011111101101a1:0100101111110110(逻辑右移)逻辑右移)a1:1100101111110110(算术右移)算术右移)右移一位,相当于除以右移一位,相当于除以2,右移右移n 位,相当于除以位,相当于除以 2n,运算速度快得多。运算速度快得多。对内存中信息的存取一般以字节为单位。实际上,有时存储一个信息对内存中信息的存取一般以字节为单位。实际上,有时存储一个信息不必用一个或多个字节,例如,不必用一个或多个字节,例如,“真真”或或“假假”用用0 或或1 表示,只需表示,只需 1 位位 即即可。可以在一个字节中存放几个信息,实现的方法有:可。可以在一个字节中存放几个信息
14、,实现的方法有:1.人为地在一个字节中设几项,使得这几项分别占据该字节中的人为地在一个字节中设几项,使得这几项分别占据该字节中的某几位。某几位。例如,在例如,在data 中,设中,设a、b、c、d 分别占分别占 2 位、位、6 位、位、4 位、位、4 位,对位,对其中的某一项其中的某一项 c 赋值赋值 12 时,需要以下操作:时,需要以下操作:将字节中将字节中c 项的对应位项的对应位清零:清零:data=data&0177417(屏蔽字屏蔽字)将要输入的数将要输入的数 12 左移左移 4 位,至位,至 与该与该 c 项的项的 位数对应位数对应,即使,即使1100 成成为右面起第为右面起第 47
15、 位。(位。(1100 4(2)设置一个右端设置一个右端4 位全为位全为1 其余全为其余全为 0 的数,的数,方法是:方法是:(04)(见下面所示)0:1111.111111 04:1111.110000(左移4位)c=(04;c=(04);d=b&c;printf(%o,%dn,a,a);printf(%o,%dn,d,d);a15 8 7 4 3 015 4 3 0 12.2 位运算举例位运算举例例例12.2 整数整数 a 循环右移循环右移 n 位位 (1)将将 a 右端右端 n 位先放到位先放到 b中的左端中的左端 n 位位b=an (3)将将 c与与 b按位或按位或 c|bmain()
16、unsigned a,b,c;int n;scanf(%u,%d,&a,&n);b=a n;c=c|b;printf(%u%d=%un,a,n,c);若若 a=1101010111111011 n=3 c=0111101010111111这里用二进制表示这里用二进制表示.c|b左左16-n位位n位位an位位000.0000bn个个0左左16-n位位ca右右n位位a左左16-n位位n位位 0 0 0.01.计算下列表达式的值。计算下列表达式的值。(1)5&3,7&4,5|3,7|4 (2)5&3,7&4,5|3,7|4,(3)(-12)&6,13 9,15,93,2.计算下列语句,给出结果。计算下列语句,给出结果。(1)a=-4;b=a|6;(2)a=3;b=a 2;(4)a=3;b=4;k=2;a|b|k;a&b&k;a&b;a =b=k;(b*k)2)&a;小小 练练 习习