C语言程序设计提高篇第4章位运算.ppt

上传人:sccc 文档编号:5336635 上传时间:2023-06-27 格式:PPT 页数:39 大小:233.51KB
返回 下载 相关 举报
C语言程序设计提高篇第4章位运算.ppt_第1页
第1页 / 共39页
C语言程序设计提高篇第4章位运算.ppt_第2页
第2页 / 共39页
C语言程序设计提高篇第4章位运算.ppt_第3页
第3页 / 共39页
C语言程序设计提高篇第4章位运算.ppt_第4页
第4页 / 共39页
C语言程序设计提高篇第4章位运算.ppt_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《C语言程序设计提高篇第4章位运算.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计提高篇第4章位运算.ppt(39页珍藏版)》请在三一办公上搜索。

1、C语言程序设计提高篇,第4章 位运算,内容概述,位运算操作位段的概念,教学目标,字节和位的有关概念;正确使用常见的位运算符和位运算操作;牢记位段的要领及位段的使用方法。,C语言既是一种高级语言,广泛应用于应用软件的开发和程序设计,同时又是一种低级语言,可以用于系统软件的开发和程序设计,如自动控制系统中的过程控制、参数检测、数据通讯等控制程序,都可以综合利用C语言中的指针操作、位运算和位段技术来实现。本章介绍位运算的基本形式和常用运算符,并简要介绍位段的概念。位运算的深入学习,应该在计算机原理和汇编语言程序设计课程中进行。,位运算概述所谓“位运算”,是指按二进制位进行运算。位运算的特点:运算按二

2、进制逐位进行没有借位和进位。位运算量:整型(int,short,unsiged,long)/字符型(以补码/ASCII码形式存储),不可为实型。,4.1位运算符和位运算,位运算符(Bitwise Operators),位运算符还可与赋值运算符相结合,进行位运算赋值操作。如:a&=b 等价于 a=a&b a=b 等价于 a=ab位运算时的数据类型为char/int,分析时要化为二进制形式,但在程序中书写及输出结果时仍为char/int。负数以补码形式参与运算注意与逻辑运算区别,按位与(Bitwise AND),运算规则0 用法按位清零保留某些指定位,位运算符的使用,例1#include void

3、 main()int a,b;printf(Enter a and b:);scanf(%d,%d,计算 010 000(a)&011 111(b)010 000 001 010(a)&010 000(b)000 000,Enter a and b:16,31a&b=16,Enter a and b:10,16a&b=0,按位或(Bitwise Inclusive OR),运算规则0|0=0;0|1=1;1|0=1;1|1=1;用法按位定值为1,例2#include void main()unsigned char a,b;printf(Enter a and b:);scanf(%o,%o,

4、Enter a and b:20,30a|b=30,Enter a and b:12,20a|b=32,计算 010 000(a)|011 000(b)011 000 001 010(a)|010 000(b)011 010,按位异或(Bitwise Exclusive OR,XOR),运算规则0 0=0;0 1=1;1 0=1;1 1=0;说明相“异”则为1,相“同”则为0,例3以下程序的功能是将a数据的低4位取反。#include void main()unsigned char a=0 x39,b=;a=ab;printf(%xn,a);,答案:0 x0f,计算 00111001(a)0

5、0001111(b)00110110,与0相异或,保持原值不变与自身相异或,则全部位清零交换两个整数值a=ab;b=ba;a=ab;,交换两个整数值不用临时变量,#include void main()int a=3,b=4;a=ab;b=ba;a=ab;printf(“a=%d b=%dn,a,b);结果:a=4 b=3,按位取反(Ones Complement),运算规则 0=1;1=0;用法所有位翻转获得适用于不同系统的位运算模板,例4#include void main()int a=32767;int b=a;printf(a=%d,b=%dn,a,b);,结果:a=32767,b=

6、-32768,计算a:原码:0111111111111111b:补码:1000000000000000,左移(Left Shift),运算规则i n把i各位全部向左移动n位最左端的n位被移出丢弃最右端的n位用0补齐用法若没有溢出,则左移n位相当于乘上2n运算速度比真正的乘法和幂运算快得多,例5以下程序的运行结果是 60。#include void main()unsigned int a=15,b;b=a2;printf(%d,%dn,a,b);,例6以下程序的运行结果是。#include void main()int a=12,b;b=0 x1f5,结果:12,96,计算已知:0 x1f5为

7、1 1111 0101且:a为1100 a3为1100000 111110101&001100000 001100000=96,右移(Right Shift),运算规则i n把i各位全部向右移动n位最右端的n位被移出丢弃最左端的n位用0补齐(逻辑右移)或最左端的n位用符号位补齐(算术右移)用法右移n位相当于除以2n,并舍去小数部分运算速度比真正的除法和幂运算快得多,例7以下程序的运行结果是 4,5。#include void main()int a=16,b=20;printf(%d,%d,a2,b2);,应用示例,从整数a最右端第m个位置开始取该位开始右面n位。算法如下:b=a(m-n+1)

8、c=(0n)d=b&c 注:位自右向左从0开始编号,应用示例,将一个整数a循环右移n位。算法如下:b=anc=c|b,例8:将16进制短整数按二进制打印输出输入:F1E2输出:1111000111100010输入:13A5输出:0001001110100101,算法思想:从高位到低位逐位测试每一位是0或是1。可顺次设置屏蔽字分别为1000 0000 0000 0000、0100 0000 0000 0000、0000 0000 0000 0001,与该数进行&运算,从而保留所需的一个位的状态(其余各位为0)。若结果非零则输出1,否则输出0。,#include void main()int i;

9、short a;scanf(%X,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度。这种以位为单位的成员称为“位段”。,4.2位段,位段的概念,1.位段的含义 位段是以位为单位定义长度的结构体类型中的成员.2、位段的构成例如:struct pack unsigned a:2;unsigned b:6;unsigned c:8;int x;data;这个结构体类型的变量在内存中的情况为:,也可以使各个字段不恰好占满一个字节struct pack unsigned a:2;unsigned b:6;unsigned c:4;int x;data;则内存中的分配形式为:此处:a,b,c共占

10、2个字节中的12位,空闲4位,int型的x从一个新的字节开始.,对位段中数据的引用方法,1、方法:通过结构体成员来应用:如:data.a=2;data.b=6;2、要点:注意每个字段的最大取值范围.如:data.a的取值只能是:03,因为两位二进制最大表示的数为3.,1.若某个位段要从新的存储单元开始,可以这样定义:struct packunsigned a:2;unsigned:0;unsigned b:4;unsigned c:4;int x;data;注意:长度为0的位段的作用是使下一个位段的内容从新的存储单元开始存放。,位段的使用要点,位段的使用要点,2.一个位段存储在同一个机器字中,

11、不能跨字存储.如下面的定义是错误的(假设机器的字长为16位)struct pack unsigned a:2;unsigned b:5;unsigned c:10;unsigned d:4;int x;data;,3.可以定义无名字段struct pack unsigned a:2;unsigned:5;/*空闲不用*/unsigned b:2;unsigned c:4;int x;data;,位段的使用要点,4.位段可以用十进制的整型形式输出,也可以用其他的整型格式输出(如八进制,十六进制和无符号),位段以整型的形式参加算术运算.分析下面的程序:例9:void main()struct pa

12、ck unsigned a:2;unsigned b:3;unsigned c:1;unsigned d:4;unsigned e:3;unionstruct pack qp;unsigned i;abc;abc.i=255;printf(“%dn”,abc.qp.d);,位段的使用要点,例10:分析下列程序的输出结果#define N 2#define CUBE(X)(X*X*X)#include void main()int i=N+2;i=CUBE(i);printf(%dn,i);,运行结果为:64,例11:下列程序的输出结果是什么?#include void main()struct

13、 equip unsigned a:2;unsigned b:3;unsigned c:1;unsigned d:4;unsigned e:3;unsigned:3;union struct equip eq;unsigned i;abc;abc.i255;printf(“%dn,abc.eq.d);,运行结果为:3,习题4.1 编写一个函数getbits,从一个16位的单元中取出某几位(即该几位保留原值,其余位为0)。函数调用形式为getbits(value,n1,n2)。value为该16位(两个字节)中的数据值,n1为欲取出的起始位,n2为欲取出的结束位。如:getbits(0101675,5,8)表示对八进制101675这个数,取出它的从左面起第5位到第8位。,4.2 写一函数,对一个16位的二进制数取出它的奇数位(即从左边起第1、3、5、15位)。4.3 编一程序,检查一下你所用的计算机系统的C编译在执行右移时是按照逻辑位移的原则还是按算术右移原则?如果是逻辑右移,请你编一函数实现算术右移?如果是算术右移,请编写一函数以实现逻辑右移。,4.4 编一函数用来实现左右循环移位。函数名为move,调用方法为move(value,n)其中value为要循环位移的数,n为位移的位数。如n0表示为左移;n0为右移。如n=4,表示要右移4位;n=-3,为要左移3位。,

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号