《第12章位运算2.ppt》由会员分享,可在线阅读,更多相关《第12章位运算2.ppt(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第12章 位 运 算C程序设计第第12章章 位运算位运算12.1 位运算符和位运算位运算符和位运算12.2 位段位段第12章 位 运 算C程序设计12.1 位运算符和位运算位运算符和位运算概念概念q位运算是指按二进制位进行的运算。因为在系位运算是指按二进制位进行的运算。因为在系统软件中,常要处理二进制位的问题。统软件中,常要处理二进制位的问题。例如:例如:将一个存储单元中的各二进制位左移或右移。将一个存储单元中的各二进制位左移或右移。第12章 位 运 算C程序设计12.1 位运算符和位运算位运算符和位运算语言提供的位运算符有:语言提供的位运算符有:运算符运算符含义含义运算符运算符含义含义&按位
2、与按位与取反取反|按位或按位或右移右移说明:说明:位运算符中除位运算符中除以外,均为双目运算符。以外,均为双目运算符。运算量只能是整型或字符型的数据,不能为实型数据。运算量只能是整型或字符型的数据,不能为实型数据。第12章 位 运 算C程序设计12.1.1 “按位与按位与”运算符(运算符(&)按位与:按位与:q按按二进制二进制位进行位进行“与与”运算。运算。运算规则:运算规则:0&0=00&1=01&0=01&1=1第12章 位 运 算C程序设计12.1.1 “按位与按位与”运算符(运算符(&)例如:例如:3&5=?00 00 00 11 (3)&00 00 01 01 (5)00 00 00
3、 01 (1)【例例例例12.1 12.1】#include void main()int a=3,b=5,and;and=a&b;printf(%dn,and);getch();运行结果:运行结果:1第12章 位 运 算C程序设计12.1.1 “按位与按位与”运算符(运算符(&)注意:注意:q如果参加如果参加&运算的是负数,则以补码形式进行运算的是负数,则以补码形式进行“与与”运算。运算。第12章 位 运 算C程序设计应用:应用:1.清零(即全部二进制位为)清零(即全部二进制位为)q方法:方法:找一个二进制数,满足条件:原来的数中找一个二进制数,满足条件:原来的数中为为1的位,新数中相应位为
4、的位,新数中相应位为0。然后使二者。然后使二者进行运算。进行运算。00 10 10 11&10 01 01 0000 00 00 00 第12章 位 运 算C程序设计应用:应用:2.取一个数中某些指定位取一个数中某些指定位q方法:将这个数与方法:将这个数与1按位与即可。按位与即可。例如:有一个整数(个字节),想要取其中的低例如:有一个整数(个字节),想要取其中的低字节。字节。00 10 11 00 10 10 11 00&00 00 00 00 11 11 11 1100 00 00 00 10 10 11 00 第12章 位 运 算C程序设计12.1.2 “按位或按位或”运算符(运算符(|)
5、按位与:按位与:q按按二进制位二进制位进行进行“或或”运算。运算。运算规则:运算规则:0|0=00|1=11|0=11|1=1第12章 位 运 算C程序设计00 11 00 00(060)|00 00 11 11(017)00 11 11 11(077)12.1.2 “按位或按位或”运算符(运算符(|)例如:例如:060|017=?【例例例例12.2 12.2】#include void main()int a=060,b=017,or;or=a|b;printf(%on,or);运行结果:运行结果:77第12章 位 运 算C程序设计应用:应用:1.常用来对一个数据的某些位定值为常用来对一个数
6、据的某些位定值为1。q例如:想使一个数的低位改为例如:想使一个数的低位改为1,只需将这,只需将这个数与个数与017进行进行“按位或按位或”运算即可。运算即可。00 11 00 00(060)|00 00 11 11(017)00 11 11 11(077)第12章 位 运 算C程序设计12.1.3 “异或异或”运算符(运算符()“异或异或”q判断两个相应的位值是否为判断两个相应的位值是否为“异异”(不同),(不同),为为“异异”就取真(就取真(1);否则,为假();否则,为假(0)。)。运算规则:运算规则:0 0=00 1=11 0=11 1=0第12章 位 运 算C程序设计12.1.3 “异
7、或异或”运算符(运算符()例如:例如:071052=?00 11 00 00(071)00 00 11 11(052)00 11 11 11(023)【例例例例12.3 12.3】#include void main()int a=071,b=052,xor;xor=ab;printf(%on,xor);运行结果:运行结果:23第12章 位 运 算C程序设计应用:应用:1.使特定位翻转使特定位翻转q要使哪几位翻转就将相应位与要使哪几位翻转就将相应位与1进行进行“运算运算”。例如:设有,想使其低位翻转。例如:设有,想使其低位翻转。01 11 10 1000 00 11 11 01 11 01 0
8、1第12章 位 运 算C程序设计应用:应用:2.与与0相相,保留原值,保留原值q因为原数中的因为原数中的1与与0进行进行运算得运算得1,00得得0,故,故保留原数。保留原数。例如:例如:01200=01200 00 10 10(012)00 00 00 00(00)00 00 10 10(012)第12章 位 运 算C程序设计应用:应用:3.交换两个值,不用临时变量交换两个值,不用临时变量q例如:例如:a=3,b=4,想将,想将a和和b的值互换,可以的值互换,可以用以下赋值语句实现:用以下赋值语句实现:a=ab;b=ba;a=ab;011(3)a100(4)b111(7)a111(7)a100
9、(4)b011(3)b111(7)a011(3)b100(4)a第12章 位 运 算C程序设计12.1.4 “取反取反”运算符(运算符()是一个单目运算符,是一个单目运算符,q用来对一个二进制数按位取反,即将变,用来对一个二进制数按位取反,即将变,将变。将变。运算规则:运算规则:0=1 1=0第12章 位 运 算C程序设计12.1.4 “取反取反”运算符(运算符()例如:例如:025=?00 00 00 00 00 01 01 01(025)11 11 11 11 11 10 10 10(0177752)第12章 位 运 算C程序设计 12.1.5 左移运算符(左移运算符()左移运算符:左移运
10、算符:q是用来将一个数的各二进制位全部左移若干位,是用来将一个数的各二进制位全部左移若干位,右补。右补。例如:例如:a=15;a=a)右移运算符:右移运算符:q将一个数的二进制位右移若干位,移到右端的将一个数的二进制位右移若干位,移到右端的低位被舍弃,低位被舍弃,对无符号数对无符号数,高位补,高位补0。例如:例如:a=017;a=a2;0 0 0 0 1 1 1 10 0 0 0 0 0 1 1153第12章 位 运 算C程序设计说明:说明:右移一位相当于除以右移一位相当于除以2,右移,右移n位相当于除以位相当于除以2n。在右移时在右移时,需要注意符号位问题。需要注意符号位问题。q对无符号数,
11、左边高位补对无符号数,左边高位补0;q对于有符号数,左边补对于有符号数,左边补0还是还是1,要取决于所用的要取决于所用的计算机系统。计算机系统。Turbo C采用采用“算术右移算术右移”的方法:左边高的方法:左边高位补符号位。位补符号位。第12章 位 运 算C程序设计说明:说明:例:例:int a=0113755;a=a1;1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 11 1 0 0 1 0 1 1 1 1 1 1 0 1 1 001137550145766第12章 位 运 算C程序设计12.1.7 位运算赋值运算符位运算赋值运算符位运算符与赋值运算符组成复合赋值运算符。位运算
12、符与赋值运算符组成复合赋值运算符。q&=q|=q=q=q=例:例:a&=b /相当于相当于 a=a&b a=2 /相当于相当于 a=a 42.设置一个低设置一个低4位全为位全为1,其余全为其余全为0的数:的数:c=(04)3.将上面将上面b、c进行进行&运算。运算。第12章 位 运 算C程序设计【例例12.4】取一个整数取一个整数a从右端开始的从右端开始的47位位#include void main()unsigned int a,b,c,d;scanf(%o,&a);b=a4;c=(04);d=b&c;printf(%o,%dn,a,a);printf(%o,%dn,d,d);运行情况如:运
13、行情况如:331 331,21715,131 1 0 1 1 0 0 103310 0 0 0 1 1 0 1015第12章 位 运 算C程序设计【例例12.5】循环移位。循环移位。要求将要求将a进行进行右循环移位右循环移位,如图所示。,如图所示。将将a右循环移右循环移n位,即将位,即将a中原来左面(中原来左面(16-n)位右移)位右移n位,原来右端位,原来右端n位移到最左面位移到最左面n位。位。第12章 位 运 算C程序设计【例例12.5】循环移位。循环移位。分析:分析:1.将将a的右端的右端n位先放到位先放到b中的高中的高n位:位:b=an;3.将将c与与b进行进行“按位或按位或”运算:运算:c=c|b;第12章 位 运 算C程序设计【例例12.5】循环移位。循环移位。#include void main()unsigned int a,b,c;int n;scanf(%o%d,&a,&n);b=an;c=c|b;printf(%on%o,a,c);运行情况:运行情况:157653 3 15765375765 1 1 0 1 1 1 1 1 1 0 1 0 1 0 1 101576530 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1075765
限制150内