c语言第14章位运算

上传人:san****019 文档编号:70846530 上传时间:2019-01-18 格式:PPT 页数:26 大小:369.31KB
返回 下载 相关 举报
c语言第14章位运算_第1页
第1页 / 共26页
c语言第14章位运算_第2页
第2页 / 共26页
c语言第14章位运算_第3页
第3页 / 共26页
c语言第14章位运算_第4页
第4页 / 共26页
c语言第14章位运算_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《c语言第14章位运算》由会员分享,可在线阅读,更多相关《c语言第14章位运算(26页珍藏版)》请在金锄头文库上搜索。

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

2、 辑 运 算,1. 位运算说明 (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=1 3的补码: 0 0 0 0 0 0

3、 1 1 5的补码: 0 0 0 0 0 1 0 1 3&5 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”,

4、 3&14); printf(“12&12:%dn”, 12&12); 运行结果: x&y: 24 3&14: 2 3&14: 12 12&12: 12,例14.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进行按位或运算

5、,可将该数的低4位全置为1;与0377进行按位或运算,可将该数的低8位全置为1。,4. 异或运算 (1)运算符 (2)按位异或运算格式: 操作数操作数 (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

6、的补码: 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)按位取反运算主要用途 按位取反运算主要用途是间接地构造一个数,以增强程序的可移植性。例如,通过求 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)

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

8、0 00 00 00 00 00 01 11,00 00 00 00 00 00 01 11 00,整体左移2位,后补2位0,2.右移运算 (1)按位右移运算符: (2)按位右移运算格式: 操作数移位数值 (3)按位右移运算规则:将一个操作数先转换成二进制数,然后将二进制数各位右移若干位,移出的低位舍弃;并在高位补位,补位分2种情况: 若为无符号数,右移时左边高位移入0。 若为有符号数,如果原来符号位为0(正数),则左边补若干0 ;如果原来符号位为1 ,左边补若干0的称为“逻辑右移” ,左边补若干1的称为“算术右移”。如: a: 1001011111101101 (113755)8 逻辑右移

9、a1:0100101111110110 得045766 算术右移 a1:1100101111110110 得145766,(4) 按位右移运算主要用途 按位右移运算主要用途是对操作数做除法运算,即将一个操作数除以 2n 的幂运算处理为右移 n 位的按位右移运算。右移一位相当于除以2 ,右移 n 位相当于除以2n。 例14.4 从键盘上输入1个正整数给int变量n ,输出由811位构成的数(从低位、0号开始编号)。 基本思路: (1)使变量n右移8位,将811位移到低4位上 (2)构造1个低4位为1、其余各位为0的整数。 (3)与n 进行按位与运算。 (4)输出与运算结果。,程序如下: main

10、() int n , mask; printf(“Input a integer number: “); scanf(“%d“, ,例14.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 000 000 101 101,a,b,例14.6从键盘上输入1个正整数给整型变量n,按二进制位输出该数。

11、#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 &=m x=x&m = x = m x=x m =

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

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

14、igned parity: 1; /*奇偶/溢出标志*/ 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 sign: 1; /*符号标志*/ unsigned zero: 1; /*零标志*/ unsigned carry: 1; /*进位标志*/ unsigned : 0; /*长度为0的无名位段*/ unsigned parity: 1; /*奇偶/溢出标志*/ unsigned half_carry: 1; /*半进位标志*/ unsigned negative: 1; /*减标志*/ flags;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号