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

PPT
  • 阅读 54 次
  • 下载 0 次
  • 页数 39 页
  • 大小 233.535 KB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
C语言程序设计提高篇第4章位运算课件
可在后台配置第一页与第二页中间广告代码
C语言程序设计提高篇第4章位运算课件
可在后台配置第二页与第三页中间广告代码
C语言程序设计提高篇第4章位运算课件
可在后台配置第三页与第四页中间广告代码
C语言程序设计提高篇第4章位运算课件
C语言程序设计提高篇第4章位运算课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 39
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
文本内容

【文档说明】C语言程序设计提高篇第4章位运算课件.ppt,共(39)页,233.535 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-44542.html

以下为本文档部分文字说明:

——提高篇C语言程序设计—提高篇第4章位运算——提高篇内容概述位运算操作位段的概念——提高篇教学目标字节和位的有关概念;正确使用常见的位运算符和位运算操作;牢记位段的要领及位段的使用方法。——提高篇C语言既是一种高级语言,广泛应用于应用软件的开发和程序

设计,同时又是一种低级语言,可以用于系统软件的开发和程序设计,如自动控制系统中的过程控制、参数检测、数据通讯等控制程序,都可以综合利用C语言中的指针操作、位运算和位段技术来实现。本章介绍位运算的基本形式和常用运算符,

并简要介绍位段的概念。位运算的深入学习,应该在《计算机原理》和《汇编语言程序设计》课程中进行。——提高篇•位运算概述所谓“位运算”,是指按二进制位进行运算。位运算的特点:运算按二进制逐位进行——没有借位和进位。位运算量:整型(int,short,unsiged,lo

ng)/字符型(以补码/ASCII码形式存储),不可为实型。4.1位运算符和位运算——提高篇位运算符(BitwiseOperators)运算符名称举例优先级~按位取反~flag(高)(算术运算符)<<左移a<<2>>右移b>>3(关系运算符)&按位与flag&0x37^按位

异或flag^0xC4|按位或flag|0x5A(低)(赋值运算符)——提高篇•位运算符还可与赋值运算符相结合,进行位运算赋值操作。如:a&=b等价于a=a&ba>>=b等价于a=a>>b•位运算时的数据类型为char/int,分析时要化为二进制形式,但在程序中书写及输出结果时仍为char/

int。•负数以补码形式参与运算•注意与逻辑运算区别——提高篇按位与(BitwiseAND)•运算规则–0&0=0;–0&1=0;–1&0=0;–1&1=1;•用法–按位清零–保留某些指定位位运算符的使用——提高篇例1#i

nclude<stdio.h>voidmain(){inta,b;printf("Enteraandb:");scanf("%d,%d",&a,&b);printf("a&b=%d\n",a&b);}计算010000(a)&

011111(b)010000001010(a)&010000(b)000000Enteraandb:16,31a&b=16Enteraandb:10,16a&b=0——提高篇按位或(BitwiseInclusiveOR)•运算规

则–0|0=0;–0|1=1;–1|0=1;–1|1=1;•用法–按位定值为1——提高篇例2#include<stdio.h>voidmain(){unsignedchara,b;printf("Enteraandb:");scanf("%o,

%o",&a,&b);printf("a|b=%o\n",a|b);}Enteraandb:20,30a|b=30Enteraandb:12,20a|b=32计算010000(a)|011000(b)011000001010(a)|010000(b)011010——提高篇按位异或(Bitwis

eExclusiveOR,XOR)•运算规则–0^0=0;–0^1=1;–1^0=1;–1^1=0;•说明–相“异”则为1,相“同”则为0——提高篇例3以下程序的功能是将a数据的低4位取反。#include<stdio.h>voidmain(){unsignedchara=0x3

9,b=;a=a^b;printf("%x\n",a);}答案:0x0f计算00111001(a)^00001111(b)00110110与0相异或,保持原值不变与自身相异或,则全部位清零交换两个整数值a=a^b;b=b^a;a=a

^b;——提高篇交换两个整数值不用临时变量•#include<stdio.h>•voidmain()•{•inta=3,b=4;•a=a^b;•b=b^a;•a=a^b;•printf(“a=%db=

%d\n",a,b);•}•结果:a=4b=3——提高篇按位取反(One'sComplement)•运算规则–~0=1;–~1=0;•用法–所有位翻转–获得适用于不同系统的位运算模板——提高篇例4#include<stdio.h>voidmain(){inta=32767;intb=~

a;printf("a=%d,b=%d\n",a,b);}结果:a=32767,b=-32768计算a:原码:0111111111111111b:补码:1000000000000000——提高篇左移(LeftShift)•运算规则–i<<n–把i各位全部向

左移动n位–最左端的n位被移出丢弃–最右端的n位用0补齐•用法–若没有溢出,则左移n位相当于乘上2n–运算速度比真正的乘法和幂运算快得多——提高篇例5以下程序的运行结果是60。#include<stdio.h>voidmain(){unsignedinta

=15,b;b=a<<2;printf("%d,%d\n",a,b);}——提高篇例6以下程序的运行结果是。#include<stdio.h>voidmain(){inta=12,b;b=0x1f5&a<<3;pr

intf("%d,%d\n",a,b);}结果:12,96计算已知:0x1f5为111110101且:∵a为1100∴a<<3为1100000111110101&001100000001100000=96——提高篇右移(RightShift)•运

算规则–i>>n–把i各位全部向右移动n位–最右端的n位被移出丢弃–最左端的n位用0补齐(逻辑右移)–或最左端的n位用符号位补齐(算术右移)•用法–右移n位相当于除以2n,并舍去小数部分–运算速度比真正的除法和幂运算快得多——提高篇例7以下程序的运行结果是

4,5。#include<stdio.h>voidmain(){inta=16,b=20;printf("%d,%d",a>>2,b>>2);}——提高篇应用示例①从整数a最右端第m个位置开始取该位开始右面n

位。算法如下:b=a>>(m-n+1)c=~(~0<<n)d=b&c注:位自右向左从0开始编号——提高篇应用示例②将一个整数a循环右移n位。算法如下:b=a<<(16-n)c=a>>nc=c|b——提高篇•例8:将1

6进制短整数按二进制打印输出输入:F1E2输出:1111000111100010输入:13A5输出:0001001110100101——提高篇算法思想:从高位到低位逐位测试每一位是0或是1。可顺次设置屏蔽字分别为1000000000000000、010000000

0000000、……、0000000000000001,与该数进行&运算,从而保留所需的一个位的状态(其余各位为0)。若结果非零则输出1,否则输出0。——提高篇#include<stdio.h>voidmain(){inti;shorta;sc

anf("%X",&a);for(i=15;i>=0;i--)printf("%1d",a&1<<i?1:0);}——提高篇•C语言允许在一个结构体中以位为单位来指定其成员所占内存长度。这种以位为单位的成员称为“位段”。4.2位段——提高篇位段的概念•1.位段的含

义位段是以位为单位定义长度的结构体类型中的成员.•2、位段的构成例如:structpack{unsigneda:2;unsignedb:6;unsignedc:8;intx;}data;这个结构体类型的变量在内存中的情况为:–a–b–c–x26816——提高

篇也可以使各个字段不恰好占满一个字节structpack{unsigneda:2;unsignedb:6;unsignedc:4;intx;}data;则内存中的分配形式为:此处:a,b,c共占2个字节中的12位,空闲4位,int型的x从一个新的字节开始.–a–b

–c–x26416–空闲4——提高篇对位段中数据的引用方法•1、方法:通过结构体成员来应用:如:data.a=2;data.b=6;•2、要点:注意每个字段的最大取值范围.如:data.a的取值只能是:0~3,因为两位二进制最大表

示的数为3.——提高篇•1.若某个位段要从新的存储单元开始,可以这样定义:structpack{unsigneda:2;unsigned:0;unsignedb:4;unsignedc:4;intx;}data;–注意:长度为0的位段的作用是使下一个位段的内容从新的存储单元开始存放。位

段的使用要点——提高篇位段的使用要点•2.一个位段存储在同一个机器字中,不能跨字存储.如下面的定义是错误的(假设机器的字长为16位)structpack{unsigneda:2;unsignedb:5;unsignedc:10;unsignedd:4;

intx;}data;——提高篇•3.可以定义无名字段structpack{unsigneda:2;unsigned:5;/*空闲不用*/unsignedb:2;unsignedc:4;intx;}data;位段的使用

要点——提高篇•4.位段可以用十进制的整型形式输出,也可以用其他的整型格式输出(如八进制,十六进制和无符号),位段以整型的形式参加算术运算.分析下面的程序:例9:voidmain(){structpack{unsigneda:2;unsignedb:3;unsi

gnedc:1;unsignedd:4;unsignede:3;};union{structpackqp;unsignedi;}abc;abc.i=255;printf(“%d\n”,abc.qp.d);}位段的使用要点——提高篇例10:分析下列程序的输出结果#defineN2#de

fineCUBE(X)(X*X*X)#include<stdio.h>voidmain(){inti=N+2;i=CUBE(i);printf("%d\n",i);}运行结果为:64——提高篇例11:下列程序的输出结果是什么?

#include<stdio.h>voidmain(){structequip{unsigneda:2;unsignedb:3;unsignedc:1;unsignedd:4;unsignede:3;unsigned:3;};union{structequ

ipeq;unsignedi;}abc;abc.i=255;printf(“%d\n",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为位移的位数。如n<0表示为左移;n>0为右移。如n=4,表示要右移4位;n=-3,为要左移3位。

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?