• / 54
  • 下载费用:8 金币  

第13章位运算

关 键 词:
第13章位运算 第十三章 位运算 第13章 位运算 第 13 章 位 运 算 第13 章位运算
资源描述:
普通高等教育“十一五”国家级规划教材 第13章 位运算 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 由于C语言是介于高级语言和汇编语言之间的一种计算机 语言,它可用于开发系统软件,并且可以直接对地址进行运算 ,因此,C语言提供了位运算的功能。 所谓位运算是指二进制位的运算。在系统软件中,常常需 要处理二进制位的问题。例如,将一个存储单元中存储的数据 的各二进制位,左移位或右移位,两个数按位相加等。位运算 是C语言不同于其它高级语言的又一特色。 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 前面介绍的各种运算都是以字节作为最基本单位进行的。 但在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言之所 以具有广泛的用途和强大的生命力,就在于它既具有高级语言的特点 ,又具有低级语言的功能。因而C语言提供了位运算的功能,这使得C 语言也能像汇编语言一样用来编写系统程序。 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 13.1.1 位运算符 位运算符的功能是对其操作数按其二进制形式逐位地进行逻 辑运算或移位运算。由位运算的特点确定操作数只能是整数类型 或字符类型的数据,不能是实型数据。C语言提供6种位运算符。 普通高等教育“十一五”国家级规划教材 表13-1 位运算符 13.1 位运算符和位运算 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 13.1.2 按位与运算 按位与运算符“ 0 1 1 c=a printf(“a=%d\n b=%d\n a } 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 例13.2 编写一个程序,对两个整型变量、整型常量分别进行按 位 与运算,并输出它们的值。 #include void main() { int x,y; x=25;y=568; printf(“x printf(“3 printf(“-3 printf(“12 } 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 13.1.3 按位或运算 按位或运算符“|”是双目运算符。其功能是参与运算的两数各 对 应的二进位相或。只要对应的二个二进位有一个为1时,结果位 就为 1。 0|0=0;0|1=1;1|0=1;1|1=1 参与运算的两个数均以补码出现。 例如: 9|5可写算式如下: 00001001 | 00000101 00001101 (十进制为13) 可见9 |5=13。 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 按位或运算具有以下特征: (1)任何位上的二进制数只要和1进行或运算,该位即为1。 (2)任何位上的二进制数只要和0进行或运算,该位保留原值不变 。 利用这一特征可以实现如下功能: 按位或运算常用来对一个数的二进制位中一个或几个指定位置1 。 对应于a要置1的位,b对应的位为1,其余位为0。则a与b或就可以 使a 中指定位置1。 例如: a=01100000,要使a的后4位置1,则可设置b后4位为1,其余位为0 ,即b=00001111。 01100000 | 00001111 01101111 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 例13.3 验证26|108的结果。 分析:a=00011010(十进制数26),b=01101100(十进制数108)。则 a|b=01111110(十进制126)。 00011010 | 01101100 01111110 根据上述分析编写的程序如下: #include void main() { int a=9,b=5,c; c=a|b; printf(“a=%d\nb=%d\n a|b=%d\n“,a,b,c); } 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 13.1.4 按位异或运算 按位异或运算符“^”是双目运算符。其功能是参与运算 的两数各 对应的二进位相异或,当两对应的二进位相异时,结果为1 。 0^0=0; 0^1=1; 1^0=1; 1^1=0 参与运算数仍以补码出现。 例如,9^5可写成算式如下: 00001001 ^ 00000101 00001100 (十进制为12) 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 位异或运算有以下方面的应用: (1)使特定位翻转。 假设有01101011,想使其低4位翻转,即1变为0,0变为1。可 以 将它与00001111进行按位异或运算,结果为01100100,结果值的 低4 位恰好是原数低4 位的翻转。 01101011 ^ 00001111 01100100 要使哪几位翻转,就将该几位置为1,其余位置为0,将原数 与 这个数进行按位异或运算即可。这是因为原数中的1与1进行^运 算得 0,原数中的0与1进行^运算得1。 例如,有01111011,想使第3至7位翻转,只要与00111110进 行 按位异或运算即可。 01111011 ^ 00111110 01000101 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 (2)与0进行异或运算,保留原值。 例如: 13^0=13 00001101 ^ 00000000 00001101 (3)交换两个变量的值,不用中间变量。 a=5,b=8。如果想使a与b的值交换,可用以下赋值语句来实现: a=a^b; b=a^b; a=a^b; a=0101 ^ b=1000 a=1101 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 a=1101 ^ b=1000 b=0101 (十进制5) a=1101 ^ b=0101 a=1000 (十进制8) 可见,变量a与b的值进行了交换。a=a^b,实际上进行了下 面两 步运算: ① b=b^a=b^(a^b)=b^a^b=a^b^b=a^(b^b)=a^0=a ② a=a^b=(a^b)^a=a^b^a=(a^a)^b=0^b=b 例13.4 验证按位异或26^108运算。 分析:a=00011010(十进制数26),b=01101100(十进制数108) 。 则a^b=01110110(十进制118)。 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 00011010 ^ 01101100 01110110 根据上述分析编写的程序如下: #include void mian() { int a=26,b=108,c; c=a^b; printf(“a=%d\n b=%d\n a^b=%d\n“,a,b,c); getch(); } 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 程序运行结果: a=26 b=108 a^b=118 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 13.1.5 按位求反运算 求反运算符“~”为单目运算符,具有右结合性。 其功能是,对参与运算的数的各二进制位进行“取反”运算。即 : 对应的二进制位为0时,结果为1,为1时,结果为0。参与运算数均 以补码出现。 例如,a=00000000 00011010(十进制数26), 则~a=11111111 11100101(十进制数-27)。 0000000000011010 ~ 1111111111100101 “~”运算符的优先级比算术运算符、关系运算符、逻辑运算符 和 其它运算符都高。例如:~a b=~a; printf(“a=%d\n~b=%xH“,a,b); } 程序运行结果: a=6; -b=fff9H 程序说明:程序是按照数据补码进行按位取反的,输出十进 制 数据运算较大,所以本例以十六进制输出6(0000000000000110) , 则按位取反后~6(1111111111111001)。 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 例13.6 编程输出按位取反运算的值。 程序如下: #include void main() { int x=-25; unsigned int y=0; printf(“~25:%d\n “,~25); printf(“~x:%d\n “,~x); printf(“~y(1):%d\n “,~y); printf(“~y(2):%u\n “,~y); } 程序运行结果: ~25:-26 ~x:24 ~y(1):-1 ~y(2):65535 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 13.1.6 左移运算 左移运算符“ void main() { unsigned a,b; b=12; a=b”是双目运算符。 其功能是把“”左边的运算 数 的各二进位全部右移若干位,移到右端的低位被舍弃,对于无符 号 数,高位补0。“”右边的数指定移动的位数。 例如:a=15 a2表示把000001111右移为00000011(十进制3)。应该说明的 是 ,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最 高位补0,而为负数时,符号位为1,最高位是补0或是补1取决于 编 译系统的规定。Turbo C和很多系统规定为补1。右移一位相当于 该 数除以2,右移n位相当于该数除以2n。 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 例13.8 先右移,后进行与运算。 程序如下: #include void main() { unsigned a,b; printf(“input a number:“); scanf(“%d“, b=a5; b=b printf(“a=%d\tb=%d\n“,a,b); } 程序运行结果: input a number:21↙ a=21 b=0 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 13.1.8 不同长度的数据进行位运算 位运算的运算数可以是整型和字符型数据。如果两个运算数类 型不同时位数也会不同。遇到这种情况,系统将自动进行如下处理 : (1)先将两个运算数右端对齐。 (2)再将位数短的一个运算数往高位补充,即无符号数和正整 数左侧用0补全;负数左侧用1补全;然后对位数相等的这两个运算 数,按位进行位运算 。 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 例13.9 分析下面程序的运行结果。 #include void main( ) { char a='a',b='b'; int p,c,d; p=a; p=(p8; printf(“a=%d\nb=%d\nc=%d\nd=%d\n“,a,b,c,d) ; } 程序运行结果: a=97 b=98 c=97 d=98 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 例13.10 编写一个程序,实现一个无符号整数的循环左移n 位。 分析:先将无符号整数d高端的n位数通过右移操作移 至低端的n位上(高端全为0),把结果存入中间变量a中。再 通过左移运算将d左移n位(低端移入的全为0),把结果存入 另一中间变量b中。最后利用按位或运算将这两个中间变量中 的内容“拼装”在一起,完成循环左移功能。 普通高等教育“十一五”国家级规划教材 13.1 位运算符和位运算 #include unsigned int left(unsigned int d,int n) { unsigned int a,b,c; a=d(16-n); b=d unsigned int swap(unsigned int d) { unsigned int a,b,c; a=d8; b=(d unsigned b:3; unsigned c:4; }bit,*pbit; bit.a=1; bit.b=7; bit.c=15; printf(“%d,%d,%d\n“,bit.a,bit.b,bit.c); pbit= pbit-a=0; pbit-b pbit-c|=1; printf(“%d,%d,%d\n“,pbit-a,pbit-b,pbit-c); } 普通高等教育“十一五”国家级规划教材 13.2 位段结构 程序中定义了位段结构体类型bs,三个位域为a,b,c。说明 了 bs类型的变量bit和指向bs类型的指针变量pbit。这表示位段也是 可以 使用指针的。程序的9、10、11三行分别给三个位段赋值。(应 注意 赋值不能超过该位段的允许范围)程序第12行以整型量格式输出 三个 域的内容。第13行把位段变量bit的地址送给指针变量pbit。第14 行用 指针方式给位段a重新赋值,赋为0。第15行使用了复合的位运算 符 “ struct kzds; { unsigned int qw:1; unsigned int zw:2; unsigned int hw:3; unsigned int mw:1; }x1,x2; x1.qw=1; x1.hw=5; x=x1.qw+x1.hw/2; printf(“x1.qw =%u\n “, x1.qw); printf(“x1.hw =%u\n “, x1.hw); printf(“x =%d\n “, x); } 普通高等教育“十一五”国家级规划教材 13.3 程序举例 普通高等教育“十一五”国家级规划教材 13.3 程序举例 例13.14 编写一个使用位运算复合赋值运算符的程序。程序如下 : #include void main() { char a=9,b=9,c=9,d=9,e=9; a=1; /* 等价于b=b1 */ c /* 等价于c=c /* 等价于d=d|5 */ e^=5; /* 等价于e=e^5 */ printf(“%d %d %d %d %d\n“,a,b,c,d,e); } 程序运行结果: 18 4 1 13 12 本程序中赋值表达式的处理过程与+=、-=、*=、/=、%=相同。 普通高等教育“十一五”国家级规划教材 13.3 程序举例 例13.15 编写一个程序,其功能是将正整型数组中所有元素 转换 为不大于它的最大偶数,并显示输出。 为了将一个正整数转换为不大于它的最大偶数,只需将该正 整 数所对应的二进制数的最低位清0即可,即用0xfffe与该正整数做 “按 位与”运算。 根据上述分析编写的程序如下: 普通高等教育“十一五”国家级规划教材 13.3 程序举例 #include void main() { int i; int a[10]={23,14,24,31,46,55,33,68,27,40}; for(i=0;i void main() { int i; int a[10]={23,14,24,31,46,55,33,68,27,40}; for(i=0;i=,= 等。 普通高等教育“十一五”国家级规划教材 本 章 小 结 (2)利用位运算可以完成汇编语言的某些功能,如置位,位 清 零,移位等。还可进行数据的压缩存储和并行运算。 (3)位段在本质上也是结构类型,不过它的成员按二进制位 分 配内存。其定义、说明及使用的方法都与结构相同。 (4)位段提供了一种手段,使得可在高级语言中实现数据的 压 缩,节省了存储空间,同时也提高了程序的效率。
展开阅读全文
  麦档网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
0条评论

还可以输入200字符

暂无评论,赶快抢占沙发吧。

关于本文
本文标题:第13章位运算
链接地址:https://www.maidoc.com/p-15678830.html

当前资源信息

我****

编号: 20180818151806499467

类型: 共享资源

格式: PPT

大小: 456.50KB

上传时间: 2019-11-07

关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

[email protected] 2018-2020 maidoc.com版权所有  文库上传用户QQ群:3303921 

麦档网为“文档C2C模式”,即用户上传的文档所得金币直接给(下载)用户,本站只是中间服务平台,本站所有文档下载所得的金币归上传人(含作者)所有。
备案号:蜀ICP备17040478号-3  
川公网安备:51019002001290号 

本站提供办公文档学习资料考试资料文档下载


收起
展开