C语言ppt精选第12章位运算.ppt

上传人:牧羊曲112 文档编号:5426214 上传时间:2023-07-05 格式:PPT 页数:25 大小:258.99KB
返回 下载 相关 举报
C语言ppt精选第12章位运算.ppt_第1页
第1页 / 共25页
C语言ppt精选第12章位运算.ppt_第2页
第2页 / 共25页
C语言ppt精选第12章位运算.ppt_第3页
第3页 / 共25页
C语言ppt精选第12章位运算.ppt_第4页
第4页 / 共25页
C语言ppt精选第12章位运算.ppt_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《C语言ppt精选第12章位运算.ppt》由会员分享,可在线阅读,更多相关《C语言ppt精选第12章位运算.ppt(25页珍藏版)》请在三一办公上搜索。

1、教学内容:12.1 位逻辑运算 12.2 位移位运算 12.3 复合位运算 12.4 位段 教学要求:1.掌握按位与运算、按位或运算、按位异或运算、取反运算、左移运算、右移运算的运算规则。2.掌握位段的应用。,第12章 位 运 算,为了节省内存空间,在系统软件中常将多个标志状态简单地组合在一起,存储到一个字节(或字)中。语言 提供了实现将标志状态从标志字节中分离出来的位运算功能。C 既具有高级语言的特点,又具有低级语言的功能,位运算能力就是其特色之一。位运算就是指进行二进制位的运算。C提供的位运算有:名称 运算符 名称 运算符 按位与&按位异或 按位或|左移,12.1 位 逻 辑 运 算,1.

2、位运算说明(1)位运算的操作数,只能是整型或字符型数据,不能为实型数据。(2)位运算符中除按位取反“”为单目运算符外,其余均为二目运算符,即要求两侧各有一个运算量。(3)参与运算时,操作数都必须首先转换成二进制形式,然后再执行相应的按位运算。,2.按位与运算符(1)按位与运算符:&(2)按位与运算格式:操作数&操作数(3)按位与运算规则 将2个操作数先转换成二进制数(补码),当参加运算的2个二进制数之对应位都为1,则该位的结果为1,否则为0,即:0&0=0 0&1=0 1&0=0 1&1=1,例:3&5=13的补码:0 0 0 0 0 0 1 15的补码:0 0 0 0 0 1 0 1 3&5

3、 0 0 0 0 0 0 0 1 取一个数中的某些指定位清零如:a:0 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0 b:0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1(377)8 a&b 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 结果得到 a 的低 8 位,(4)按位与运算作用,main()int x,y;x=25;y=568;printf(“x&y:%dn”,x&y);printf(“3&14:%dn”,3&14);printf(“3&14:%dn”,3&14);printf(“12&12:%dn”,12&12);运行结果:x&y:24

4、3&14:2 3&14:12 12&12:12,例12.1 编程对两个整型变量、整型常量分别进行按位与运算,并输出它们的值。程序如下,3.按位或运算(1)按位或运算符:|(2)按位或运算格式:操作数 操作数(3)运算规则:参加运算的两个运算量之对应位,只要有一个为1,则该位的结果为1。即:0 0=0 0 1=1 1 0=1 1 1=1 例如:00110000(060)8 00001111(017)8 00111111(077)8 一个数与017进行按位或运算,可将该数的低4位全置为1;与0377进行按位或运算,可将该数的低8位全置为1。,4.异或运算(1)运算符(2)按位异或运算格式:操作数操

5、作数(3)按位异或运算规则:参加运算的两个运算量的对应位相同,则该位的结果为0。否则为1。即:0 0=0 0 1=1 1 0=1 1 1=0(4)运算的用途:使指定的位翻转 如:01111010 00001111 对应原数的低4位均置为1 01110101 原数的低4位被翻转,5.取反运算(1)运算符(2)按位取反运算格式:操作数(3)按位取反运算规则:是对一个二进制数按位取反,即将0变为1,1变为0。例如:a 的补码:0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 a 1 1 1 1 0 0 1 1 0 1 1 0 1 1 0 0(4)按位取反运算主要用途 按位取反运算主要用

6、途是间接地构造一个数,以增强程序的可移植性。例如,通过求 0,可以间接地构造一个各位全1的二进制数。,main()int x=25;unsigned int y=0;printf(“25:%dn”,25);printf(“x:%dn”,x);printf(“y(1):%dn”,y);printf(“y(2):%un”,y);运行结果:25:26 x:24 y(1):1 y(2):65535,例12.2 编程输出按位取反运算的值。程序如下:,12.2 位 移 位 运 算,1.按位左移运算(1)按位左移运算符:(2)按位左移运算格式:操作数移位数(3)按位左移运算规则:将一个操作数先转换成二进制数

7、,然后将二进制数各位左移若干位,并在低位补若干个0,高位左移后溢出,舍弃不起作用。(4)按位左移运算用途:将乘以 2n 的幂运算处理为左移 n 位。例如:72 按位左移表达式的值:28,例12.3 变量的位运算符#include main()unsigned a;a=72;a printf(a=%dn,a);运行结果:a=28,00 00 00 00 00 00 01 11,00 00 00 00 00 00 01 11 00,整体左移2位,后补2位0,2.右移运算(1)按位右移运算符:(2)按位右移运算格式:操作数移位数值(3)按位右移运算规则:将一个操作数先转换成二进制数,然后将二进制数各

8、位右移若干位,移出的低位舍弃;并在高位补位,补位分2种情况:若为无符号数,右移时左边高位移入0。若为有符号数,如果原来符号位为0(正数),则左边补若干0;如果原来符号位为1,左边补若干0的称为“逻辑右移”,左边补若干1的称为“算术右移”。如:a:8 逻辑右移 a1:得045766 算术右移 a1:得145766,(4)按位右移运算主要用途按位右移运算主要用途是对操作数做除法运算,即将一个操作数除以 2n 的幂运算处理为右移 n 位的按位右移运算。右移一位相当于除以2,右移 n 位相当于除以2n。例12.4 从键盘上输入1个正整数给int变量n,输出由811位构成的数(从低位、0号开始编号)。基

9、本思路:(1)使变量n右移8位,将811位移到低4位上(2)构造1个低4位为1、其余各位为0的整数。(3)与n 进行按位与运算。(4)输出与运算结果。,程序如下:main()int n,mask;printf(Input a integer number:);scanf(%d,例12.5 取一个整数 a 从右端开始的 4 7 位。先使 a 右移 4 位。即:a(7 4+1)a4 设置一个低4位全为1,其余全为0 的数。即:(0 4;/b=a(m-n+1)/c=(04);/c=(0n)/d=b 运行情况:1331 1331 15,字母o,0 000 001 011 011 001,0 000 0

10、00 000 101 101,a,b,例12.6从键盘上输入1个正整数给整型变量n,按二进制位输出该数。#include stdio.h main()int n,mask,i;printf(Input a integer number:);scanf(%d,程序运行情况:Input a integer number:1000 1000=0000,0011,1110,1000B,1.复合位赋值运算符:复合按位与赋值运算符&=复合按位或赋值运算符=复合按位异或赋值运算符=复合按位左移赋值运算符=2.复合位赋值运算规则复合位赋值运算规则与复合算术赋值运算规则相同。运算符 表达式 等价表达式&=x&=

11、m x=x&m=x=m x=x m=x=m x=xm=x=n x=xn,12.3 复 合 位 运 算,12.4 位 段,C语言引入位段类型。使得当存储1个信息只需二进制的若干位时,二进制的1个(或多个)位就够用,就可以不必占用1个字节。如果仍然使用结构类型,则造成内存空间的浪费。为此,C语言引入了位段类型。,1.位段的概念与定义(1)位段类型:位段类型是一种特殊的结构类型,其所有成员均以二进制位为单位定义长度,并称成员为位段。(2)位段类型的定义 位段类型的定义格式:struct 位段类型名 类型说明符 成员名1:长度;类型说明符 成员名2:长度;;位段类型成员的数据类型只能是:int、uns

12、igned int,(3)位段类型变量的定义 先定义位段类型,再定义位段类型变量。struct 位段类型名 类型说明符 成员名1:长度;类型说明符 成员名2:长度;struct 位段类型名 变量名表列;定义位段类型同时定义位段类型变量。struct 位段类型名 类型说明符 成员名1:长度;类型说明符 成员名2:长度;变量名表列;,例如,CPU的状态寄存器,按位段类型定义如下:struct status unsigned sign:1;/*符号标志*/unsigned zero:1;/*零标志*/unsigned carry:1;/*进位标志*/unsigned parity:1;/*奇偶/溢出

13、标志*/unsigned half_carry:1;/*半进位标志*/unsigned negative:1;/*减标志*/flags;显然,对CPU的状态寄存器而言,使用位段类型(仅需1个字节),比使用结构类型(需要6个字节)节省了5个字节。,2.说明(1)因为位段类型是一种结构类型,所以位段类型和位段变量的定义,以及对位段(即位段类型中的成员)的引用,均与结构类型和结构变量一样。(2)对位段赋值时,要注意取置范围。一般地说,长度为n的位段,其取值范围是:0(2n-1)。(3)使用长度为0的无名位段,可使其后续位段从下1个字节开始存储。,例如,struct status unsigned s

14、ign:1;/*符号标志*/unsigned zero:1;/*零标志*/unsigned carry:1;/*进位标志*/unsigned:0;/*长度为0的无名位段*/unsigned parity:1;/*奇偶/溢出标志*/unsigned half_carry:1;/*半进位标志*/unsigned negative:1;/*减标志*/flags;原本6个标志位是连续存储在1个字节中的。由于加入了1个长度为0的无名位段,所以其后的3个位段,从下1个字节开始存储,一共占用2个字节。,(4)1个位段必须存储在1个存储单元(通常为1字节)中,不能跨2个。如果本单元不够容纳某位段,则从下1个单元开始存储该位段。(5)可以用%d、%x、%u和%o等格式字符,以整数形式输出位段。(6)在数值表达式中引用位段时,系统自动将位段转换为整型数。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号