C语言大学教程 第十章 C结构体_第1页
C语言大学教程 第十章 C结构体_第2页
C语言大学教程 第十章 C结构体_第3页
C语言大学教程 第十章 C结构体_第4页
C语言大学教程 第十章 C结构体_第5页
已阅读5页,还剩128页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《C语言大学教程》课件(第10章)

教材编著:PaulDeitel(美国)

HarveyDeitel(美国)翻译:苏小红等(哈尔滨工业大学)第10章结构体、共用体、位操作和枚举类型本章主要内容结构体及其参数传递方法共用体及其特点枚举类型位运算结构体定义学号姓名年龄性别成绩1成绩2平均成绩

1AA19M8090902BB18F7870733CC17M8175794DD18F8060755EE19M768383每行的数据类型不相同,如何表示此二维数据?如何交换两行值?能否将一行看成一个整体?定义一种类型,把不同的数据作为一个整体来处理——结构体结构体概述将不同种类型的数据有序地组合在一起,构造出一个新的数据类型,这种形式称为结构体。结构体是多种类型组合的数据类型。同一个结构体可以存储多种类型的数据;是比数组更灵活的的数据格式.结构体是C++面向对象(类)的基石;结构体定义数组

------有相同类型的数据集合结构体------不同类型的数据集合构造数据类型:

由简单数据类型(int、float、char)组合而成的(有机整体)数据类型。基本类型:

整型、实型、字符型.......第10章结构体、共用体、位操作和枚举类型10.2结构体的定义结构体属于派生数据类型,即它们是用其他数据类型的对象来构建的。定义:struct

名称

{

类型名1变量名1;类型名2变量名2;

};结构的声明若要创建一种类型来描述学生信息,先要定义这种类型的数据属性——structStudent

//结构声明{intnum;//一个int成员

charname[20];//一个char数组成员

charsex;//一个char成员

intage;//一个int成员

floatscore;//一个float成员

charaddr[30];//一个char数组成员};

结构描述的组成部分structStudent

{intnum;

charname[20];

charsex;

intage;

floatscore;

charaddr[30];

};

struct关键字标识符成为结构体类型的名称结构成员(域)起始括号和结束括号分号结束模板声明说明(1)结构体类型是一种构造数据类型,它与int,char,float等系统定义的基本数据类型具有同等地位,是由用户自行定义的。构造的数据类型可以用来定义变量。(2)结构体类型不分配任何存储空间。相应结构体类型的变量、数组及动态开辟的存储单元占存储空间。结构体变量定义(方法一)先定义结构体类型,再单独进行定义struct结构体名

{成员列表};struct结构体名变量名列表;structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};structstudent

student1,student2;结构体类型名变量1变量2注意:

结构体类型只是一种数据类型,不占内存空间,只有定义结构体类型变量时才开辟内存空间。编译时,仅对变量分配空间,不对类型分配空间结构体变量定义(方法一)结构体变量定义例如:

structCard { char*face;char*suit; };

structCardc1,c[10],*p;二、在定义类型的同时定义变量structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}

student1,student2;struct

结构体名

{

成员列表

…………

}变量名列表;

紧接着定义变量结构体变量定义(方法二)三、直接定义结构体类型变量struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;struct

{

成员列表

…………

}变量名列表;

不出现结构体名结构体变量定义(方法三)结构体类型的几点说明

类型与变量是完全不同的概念。先定义结构类型,再定义变量为该类型。

类型:不可赋值、存贮、运算;系统不分配空间。变量:可赋值、存贮、运算;系统要分配空间。结构体中的成员可以象变量一样使用。例如:struct

date/*声明一个结构体类型strcutdate*/

{intmonth;intday;intyear;};struct

student/*声明一个结构体类型strcutstudent*/{int

num;

char

name[20];

char

sex;

int

age;

struct

date

birthday;

/*birthday是structdate类型*/

charaddr[30];};先声明一个structdate类型,它代表“日期”,包括3个成员:month(月)、day(日)、year(年)。然后在声明structstudent类型时,将成员birthday指定为structdate类型。已声明的类型

structdate与其他类型一样可以用来定义成员的类型。图11-3birthdayaddrNumnamesexageMonthdayyear

成员可以是另一个结构体变量结构体类型的几点说明结构体中的成员也可为结构体变量structstudent{intnum;charname[12];charsex;

struct{intyear;intmonth;intday;}birthday;floatsc[4];};结构体类型的附加说明结构体类型的变量在内存按成员的顺序排列,所占空间是其全体成员所占空间的总和对结构体中各个成员可以单独引用、赋值,其作用与普通变量等同。格式:变量名.

成员名

date1.day‘.’——成员运算符(优先级最高)成员名可与程序中的变量名相同,但二者无关。结构体的成员可以是另一个结构体类型structdate{intmonth;intday;intyear;}date1;structstudent0{intnum;charname[20];date

birthday;};

说明:结构体声明的位置很重要放在main()之前,称为外部声明;外部声明可以被其后面的任何函数使用;放在main()函数中,称为内部声明;内部声明只能被该声明所属的函数使用;通常应使用外部声明,这样所有函数都可以使用这种类型的结构。//练习.画出下列结构的内存设置图:

structxyz{shortx;inty;floatz;};xyza;4个字节z4个字节y2个字节x变量astructuvw{charu[10];int*v;intw[5];};uvwb;//练习画出下列结构的内存设置图:

20个字节w[1]w[0]w[4]4个字节v......10个字节...u[10]变量b结构体类型变量初始化structstudent

{intnum;charname[12];charsex;}std1={10101,"LiMing",‘M’};structstrudentstd2={10001,”AA”,’F’};注意:一一对应赋初值,不允许跳跃赋值。可只给前面的成员赋值,可以从后面缺省。4结构体变量的引用在定义了结构体变量以后,当然可以引用这个变量。但应遵守以下规则:

(1)不能将一个结构体变量作为一个整体进行输入和输出。例如:已定义student1和student2为结构体变量并且它们已有值。printf(″%d,%s,%c,%d,%f,%\n″,student1);

结构体类型变量初始化数组中的每个元素是一个结构体类型的数据,因此将此成员的值依次放在一对花括号中例:structbookcard{charnum[5];floatmoney;}bk[3]={{"NO.1",35.5},{"NO.2",25.0},{"NO.3",66.7}};给二维结构体数组赋初值例struct{charch;inti;floatx;}arr[2][3]={{{'a',1,3e10},{'a',2,4e10},{'a',3,5e10}},{{'b',1,6e5},{'b',2,7e5},{'b',3,8e5}}};如何使用结构体中的成员以下3种形式等价:(p是个指针)结构体变量.成员名(*p).成员名p->成员名结构体变量的成员可以像普通变量一样进行各种运算.

structdata{intmonth;intday;intyear;};structstudent{charname[20];charsex;

databirthday;intsc[4];}std1,arr[5],*p;(1)使用sexstd1.sex(通过结构体变量引用)引用arr[0]中的sex:

arr[0].sex不能写作arr.sex(*p).sexP->sex(2)引用sc中的元素,如sc[1]:std1.sc[1](通过结构体变量引用)(3)成员为字符串,如name:(通过结构体变量引用)

arr[0].name(4)内嵌结构体成员的引用,逐层使用成员名定位引用std1中的出生年份,std1.birthday.year如何使用结构体中的成员例是字符串,可以对它进行对任何字符串允许的操作,包括输入输出。对结构体变量中的每个成员,可对它进行同类变量所允许的任何操作。对结构体变量中的成员进行操作(1)对name的操作

scanf(“%s”,);注意:不能写成="LiMing”;(2)对sex的操作 ①scanf(“%c”,&std1.sex); ②for(i=0;i<3;i++) scanf(“%c”,&pers[i].sex); ③std1.sex='M';对结构体变量中的成员进行操作(3)对birthday中year的操作 ①scanf(“%d”,&std1.birthday.year); ②std1.birthday.year=1962;对结构体变量中的成员进行操作对结构体变量中的成员进行操作整体赋值

structt{inti,j;charname[10];};structtt1={12,48,"LiLi"},t2;t2=t1;其中“t2=t1;”等同于:t2.i=t1.i;t2.j=t1.j;strcpy(,);第10章结构体、共用体、位操作和枚举类型10.4对结构体成员的访问图10.2程序:结构体访问1/*Fig.10.2:fig10_02.c2Usingthestructurememberand3structurepointeroperators*/4#include<stdio.h>56/*cardstructuredefination*/第10章结构体、共用体、位操作和枚举类型10.4对结构体成员的访问图10.2程序:结构体访问7structcard{8char*face;9char*suit;10}/*endstructurecard*/1112intmain(void)13{第10章结构体、共用体、位操作和枚举类型10.4对结构体成员的访问图10.2程序:结构体访问14structcardaCard;15structcard*cardPtr;1617/*placestringinaCard*/18aCard.face=“Ace”;19aCard.suit=“Spades”;20第10章结构体、共用体、位操作和枚举类型10.4对结构体成员的访问图10.2程序:结构体访问21cardPtr=&aCard;2223printf(“%s%s%s\n%s%s%s\n%s%s%s\n”,aCard.face,“of”,aCard.suit,24cardPtr->face,“of”,cardPtr->suit,第10章结构体、共用体、位操作和枚举类型10.4对结构体成员的访问图10.2程序:结构体访问25(*cardPtr).face,“of”,(*cardPtr).suit,26return0;27}/*endmain*/第10章结构体、共用体、位操作和枚举类型10.4对结构体成员的访问图10.2程序执行结果AceofSpadesAceofSpadesAceofSpades第10章结构体、共用体、位操作和枚举类型10.5在函数中使用结构体将结构体传递给函数的方式传递结构体的个别成员;值传递传递整个结构体:值传递当结构体包含一个数组时,该数组为值传递传递一个指向结构体的指针:引用用typedef声明类型

用typedef声明一个新的类型名来代替已有的类型名。例如:typedefintINTEGER;//指定用标识符INTEGER代表int类型typedeffloatREAL;//指定用REAL代表float类型以下两行等价:①inti,j;floata,b;②INTEGERi,j;REALa,b;第10章结构体、共用体、位操作和枚举类型10.6typedef的使用为已定义好的数据类型创建同义词typedefstructcardCard;typedefstruct{char*face;char*suit;}Card;structCarddeck[52];第10章结构体、共用体、位操作和枚举类型10.7实例:高性能的洗牌与发牌模拟图10.3程序:用结构体数组来表示纸牌1/*Fig.10.3:fig10_3.c2TheCardshufflingdealingprogramusingstructures*/3#include<stdio.h>4#include<stdlib.h>5#include<time.h>67/*cardstructuredefinition*/第10章结构体、共用体、位操作和枚举类型10.7实例:高性能的洗牌与发牌模拟图10.3程序:用结构体数组来表示纸牌8structurecard{9constchar*face;10constchar*suit;11}/*endstructurecard*/1213typedefstructcardCard;14第10章结构体、共用体、位操作和枚举类型10.7实例:高性能的洗牌与发牌模拟图10.3程序:用结构体数组来表示纸牌15/*prototypes*/16voidfilldeck(Card*constwDeck,constchar*wFace[],17constchar*wSuit[]);18voidshuffle(Card*constwDeck);19voiddeal(constCard*constwDeck);第10章结构体、共用体、位操作和枚举类型10.7实例:高性能的洗牌与发牌模拟图10.3程序:用结构体数组来表示纸牌2021intmain(void)22{23Carddeck[52];2425/*initializearrayofpointers*/第10章结构体、共用体、位操作和枚举类型10.7实例:高性能的洗牌与发牌模拟图10.3程序:用结构体数组来表示纸牌26constchar*face[]={“Ace”,“Deuce”,“Three”,“Four”,27“Five”,“Six”,“Seven”,“Eight”,28“Nine”,“Ten”,“Jack”,“Queen”,“King”};2930/*initializearrayofpointers*/第10章结构体、共用体、位操作和枚举类型10.7实例:高性能的洗牌与发牌模拟图10.3程序:用结构体数组来表示纸牌31constchar*suit[4]={“Hearts”,“Diamonds”,“Clubs”,“Spades”};3233srand(time(NULL));3435fillDeck(deck,face,suit);36shuffle(deck);第10章结构体、共用体、位操作和枚举类型10.7实例:高性能的洗牌与发牌模拟图10.3程序:用结构体数组来表示纸牌37deal(deck,face,suit);38return0;39}/*endmain*/4041/*placestringsintocardstructure*/第10章结构体、共用体、位操作和枚举类型10.7实例:高性能的洗牌与发牌模拟图10.3程序:用结构体数组来表示纸牌42voidfillDeck(Card*constwDeck,constchar*wFace,43constchar*wSuit)44{45inti;4647/*loopthroughwDeck*/48for(i=0;i<=51;i++){第10章结构体、共用体、位操作和枚举类型10.7实例:高性能的洗牌与发牌模拟图10.3程序:用结构体数组来表示纸牌49wDeck[i].face=wFace[i%13];50wDeck[i].suit=wSuit[i/13];51}/*endfor*/52}/*endfillDeck*/5354/*shufflecards*/第10章结构体、共用体、位操作和枚举类型10.7实例:高性能的洗牌与发牌模拟图10.3程序:用结构体数组来表示纸牌55voidshuffle(Card*constwDeck)56{57inti;58intj;/*0-51randomvalue*/59Cardtemp;6061/*koopthroughwDeckrandomlyswappingCards*/第10章结构体、共用体、位操作和枚举类型10.7实例:高性能的洗牌与发牌模拟图10.3程序:用结构体数组来表示纸牌62for(i=0;i<=51;i++){63j=rand()%52;64temp=wDick[i];65wDeck[i]=wDeck[j];66wDeck[j]=temp;67}/*endfor*/68}/*endshuffle*/69第10章结构体、共用体、位操作和枚举类型10.7实例:高性能的洗牌与发牌模拟图10.3程序:用结构体数组来表示纸牌70/*dealcards*/71voiddeal(constCard*constwDeck)72{73inti;7475/*loopthrouthwDeck*/第10章结构体、共用体、位操作和枚举类型10.7实例:高性能的洗牌与发牌模拟图10.3程序:用结构体数组来表示纸牌76for(i=0;card<=51;i++){77printf(“%5sof%-8s%s”,wDeck[i].face,wDeck[i].suit,78(i+1)%4?““:“\n”);79}/*endfor*/80}/*enddeal*/第10章结构体、共用体、位操作和枚举类型10.7实例:高性能的洗牌与发牌模拟图10.3程序执行结果

链表的概念的引出//定义结构体数组存储80个学生信息

structstudent{intnum;floatscore;}stu[80];

用结构体数组只能静态存储数据定长连续存放89stu[0]100167.5stu[1]1002stu[2]100356...stu[79]1000numscore学生1:100189学生2:100267.5学生3:100356…学生80:…2000100189100267.51003561000300030002000NULL.........链表:不定长;链表的每一个元素称为结点,其组成:若干数据成员;

指向下一个结点的指针成员;按需分配结点存放数据,不用时随时释放;头结点;头指针:head;尾结点;空指针:NULL#defineNULL01000Head

891001200067.510023000561003NULL100020003000用链表存储结构指针存储结构

逻辑结构用结构体类型描述链表结点structstudent{intnum;floatscore;student*next;};student*head;5610031000891001NULL2000head20003000100067.510023000scorenumnext结点类型递归定义建立链表的过程

生成头结点;//head指向头结点 将其余结点逐个加入链表; 生成尾结点;//尾结点指针域为NULL77.71002300088.51003NULL1000head1000200030009910012000

生成头结点;//head指向头结点 将其余结点逐个加入链表; 生成尾结点;//尾结点指针域为NULLstructstudent{intnum;floatscore;student*next;}s1={1001,99},s2={1002,77.7},s3={1003,88.5};

77.71002

88.51003

100020003000991001

s1s2s3建立链表的过程建立链表的过程

生成头结点;//head指向头结点 将其余结点逐个加入链表; 生成尾结点;//尾结点指针域为NULLstructstudent{intnum;floatscore;student*next;}s1={1001,99},s2={1002,77.7},s3={1003,88.5};77.71002

88.51003

1000head100020003000991001

s1s2s3建立链表的过程

生成头结点;//head指向头结点

将其余结点逐个加入链表; 生成尾结点;//尾结点指针域为NULLstructstudent{intnum;floatscore;student*next;}s1={1001,99},s2={1002,77.7},s3={1003,88.5};

77.71002300088.51003NULL1000head1000200030009910012000s1s2s3建立链表的过程

structstudent{intnum;floatscore;student*next;}s1={1001,99},s2={1002,77.7},s3={1003,88.5};intmain(){student*head;head=&s1;s1.next=&s2;s2.next=&s3;s3.next=NULL;

…}77.71002300088.51003NULL1000head1000200030009910012000s1s2s3

建立一个链表intmain(){

student*head;//生成头结点

head=&s3;

//连接链表其余结点

s3.next=&s1;s1.next=&s2;

//生成尾结点

s2.next=NULL;…}s3->s1->s2

3000Head991001

100077.71002

2000300088.5100310002000NULLs3s1s2

2000&s299100177.7100288.510031000&s13000&s3

.........991001200077.71002NULL3000head30001000200088.510031000定义一个指向链表结点类型的辅助指针变量pp=head;//p指向头结点

do{cout<<p->num<<‘’<<p->score<<endl;p=p->next;}while(p!=NULL);

p//输出*p结点数据//p指向下一个结点pp遍历链表:依次输出各个结点的数据30001000

共用体类型(union)

几种不同类型的变量存放到同一段内存单元中。例如把一个整型变量、一个字符型变量、一个双精度型变量放在同一个地址开始的内存单元中.变量在内存中占的字节数不同,但都从同一地址开始存放。这种使几个不同的变量共占同一段内存的结构,称为共用体(union)类型的结构。声明共用体类型的一般形式为

union共用体类型名{成员表列};定义共用体变量的一般形式为共用体类型名共用体变量名;共用体类型(union)union

data{charch;shortinti;floatf;};

共用体关键字:union

共用体类型名:data共用体成员变量:

charch;shortinti;floatf;内存设置图(union

data)chif共用体能够存储不同的数据类型,但每次只能存储其中的一种类型;共用体的长度为其最大成员的长度引用和赋值dataa,b,*p;P=&b;共用体变量成员赋值a.ch='h';a.i=120;a.f=12.34;p->ch='h',p->i=120;p->f=12.34;uniondata{charch;inti;floatf;};hich

变量af1000ich

变量bf2000...p...12012.34

共用体指针p指向共用体变量bp=&b;2000h12012.34

unionun{charstr[10];struct{shortintx;shortinty;floatz;}dat;};una;

//定义un型变量a//引用举例a.str[0]='h';a.dat.x=12;a.dat.y=12345;a.dat.z=3.14;strcpy(a.str,”helloabc”);内存设置图(unionun)xyzstr例画出以下共用体类型的内存设置图共用体的应用举例strcutwidget{charbrand[20];//名称

inttype;//类别

unionid{longid_num;charid_char[20];}id_val;//商品id};…structwidgetprize;…if(prize.type==1)//根据类别的不同取值决定id的用法

scanf(“%ld”,&prize.id_val.id_num);elsescanf(“%c”,&prize.id_val.id_char);共用体的用途之一——当数据项使用两种或更多种格式(但不会同时使用)时,可节省空间。例如:一个管理小商品目录,其中有一些商品的ID为整数,而另一些的ID为字符串;共用体类型数据的特点(1)使用共用体变量的目的是希望用同一个内存段存放几种不同类型的数据。但请注意:在每一瞬时只能存放其中一种,而不是同时存放几种。(2)能够访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后原有的成员就失去作用。(3)共用体变量的地址和它的各成员的地址都是同一地址。(4)不能对共用体变量名赋值;不能企图引用变量名来得到一个值;不能在定义共用体变量时对它初始化;不能用共用体变量名作为函数参数。72unionun{inti;doubley;};structst{chara[10];unionunb;};printf(“%d”,sizeof(structst));1873voidmain(void){unionEXAMPLE{struct{intx;inty;}in;inta,b;}e;e.a=1;e.b=2;e.in.x=e.a*e.a;e.in.y=e.b+e.b;printf(“%d%d”,&e.in.x,e.in.y);}inxyabb1248输出:48第10章结构体、共用体、位操作和枚举类型10.9位运算符位运算符用于处理整型操作数的各个二进制数位。将各类数据当作无符号整型数处理位运算符种类按位与:&,按位或:¦,按位异或:^左移:<<,右移:>>按位取反:~第10章结构体、共用体、位操作和枚举类型10.9位运算符位运算符种类第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.7程序:按位显示一个无符号整数1/*Fig.10.7:fig10_07.c*/2Printinganunsignedintegerinbits*/3#include<stdio.h>45voiddisplayBits(unsignedvalue);6第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.7程序:按位显示一个无符号整数7intmain(void)8{9unsignedx;1011printf(“Enteranunsignedinteger:“);12scanf(“%u”,&x);第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.7程序:按位显示一个无符号整数1314displayBits(x);15return0;16}/*endmain*/1718/*displaybitsofanunsignedintegervalue*/第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.7程序:按位显示一个无符号整数19voiddisplayBits(unsignedvalue)20{21unsignedc;2223/*definedisplayMaskandleftshift31bits*/第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.7程序:按位显示一个无符号整数24unsigneddisplayMask=1<<31;2526printf(“%10u=”,value);2728/*loopthroughbits*/29for(c=1;c<=32;c++)第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.7程序:按位显示一个无符号整数30putchar(value&displayMask?‘1’:‘0’);31value<<=1;3233if(c%8==0){34putchar(‘‘);35}/*endif*/36}/*endfor*/第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.7程序:按位显示一个无符号整数3738putchar(‘\n’);39}/*enddisplayBits*/第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.7程序执行结果Enteranunsignedinteger:6500065000=00000000000000001111110111101000第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.9程序:按位与、或等运算符的使用1/*Fig.10.9:fig10_09.c2UsingthebitwiseAND,bitewiseOR,bitewise3exclusiveORandbitwise

complementoperators*/4#include<stdio.h>5第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.9程序:按位与、或等运算符的使用6voiddisplayBits(unsignedvalue);78intmain(void)9{10unsignednumber1;11unsignednumber2;/*异或*/12unsignedmask;/*与运算*/第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.9程序:按位与、或等运算符的使用13unsignedsetBits;/*或运算*/1415/*demonstrateAND(&)*/16number1=65535;17mask=1;18printf(“Theresultofcombiningthefollowing\n”);第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.9程序:按位与、或等运算符的使用19displayBits(number1);20displayBits(mask);21printf(“usingthebitwiseANDoperator&is\n”);22displayBits(number1&mask);2324/*demonstrateinclusiveOR(¦)*/第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.9程序:按位与、或等运算符的使用25number1=15;26setBits=241;27printf(“Theresultofcombiningthefollowing\n”);28displayBits(number1);29displayBits(setBits);第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.9程序:按位与、或等运算符的使用30printf(“usingthebitwiseinclusiveORoperator¦is\n”);31displayBits(number1¦mask);3233/*demonstrateexclusiveOR(^)*/第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.9程序:按位与、或等运算符的使用34number1=139;35number2=199;36printf(“Theresultofcombiningthefollowing\n”);37displayBits(number1);38displayBits(number2);39printf(“usingthebitwiseexcluseveORoperator^is\n”);第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.9程序:按位与、或等运算符的使用40displayBits(number1^number2);4142/*demonstratebitwisecomplement(~)*/43number1=21845;44printf(“\nTheone’scomplementof\n”);第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.9程序:按位与、或等运算符的使用45displayBits(number1);46printf(“is\n”);47displayBits(~number1);48return0;49}/*endmain*/50第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.9程序:按位与、或等运算符的使用51/*displaybitsofanunsignedintegervalue*/52voiddisplayBits(unsignedvalue)53{54unsignedc;5556/*declaredisplayMaskandleftshift31bits*/第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.9程序:按位与、或等运算符的使用57unsigneddisplayMask=1<<31;5859printf(“%10u=”,value);6061/*loopthroughbits*/62for(c=1;c<=32;c++)第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.9程序:按位与、或等运算符的使用63putchar(value&displayMask?‘1’:‘0’);64value<<=1;6566if(c%8==0){67pucchar(‘‘);68}/*endif*/69}/*endfor*/第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.9程序:按位与、或等运算符的使用7071putchar(‘\n’);72}/*enddisplayBits*/第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.9程序执行结果Theresultofcombiningthefollowing65535=000000000000000011111111111111111=0000000000000000

00000000

00000001usingthebitwiseANDoperator&is1=0000000000000000

00000000

00000001第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.9程序执行结果Theresultofcombiningthefollowing15=0000000000000000

00000000

00001111241=0000000000000000

00000000

11110001usingtheincluseveORoperator¦is255=0000000000000000

00000000

11111111第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.9程序执行结果Theresultofcombiningthefollowing139=0000000000000000

0000000010001011199=0000000000000000

00000000

11000111usingtheexclusiveORoperator^is76=0000000000000000

00000000

01001100第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.9程序执行结果Theone’scomplementof21845=00000000000000000101010101010101is4294945450=11111111111111111010101010101010第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.13程序:按位左移和右移1/*Fig.10.13:fig10_13.c2Usingtheshiftoperators*/3#include<stdio.h>45voiddisplayBits(unsignedvalue);67intmain(void)8{第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.13程序:按位左移和右移9unsignednumber1=960;1011/*demonstrateleftshift*/12printf(“\nTheresultofleftshifting\n”);13displayBits(number1);14printf(“8bitpositionsusingthe”);第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.13程序:按位左移和右移15printf(“lefttshiftoperator<<is\n”);16displayBits(number1<<8);1718/*demonstraterightshift*/19printf(“\nTheresultofrightshifting\n”);第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.13程序:按位左移和右移20displayBits(number1);21printf(“8bitpositionsusingthe”);22printf(“rightshiftoperator>>is\n”);23displayBits(number1>>8);24return0;25}/*endmain*/第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.13程序:按位左移和右移2627/*displaybitsofanunsignedintegervalue*/28voiddisplayBits(unsignedvalue)29{30unsignedc;3132/*definedisplayMaskandleftshift31bits*/第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.13程序:按位左移和右移33unsigneddisplayMask=1<<31;3435printf(“%7u=”,value);3637/*loopthroughbits*/38for(c=1;c<=32;c++)第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.13程序:按位左移和右移39putchar(value&displayMask?‘1’:‘0’);40value<<=1;4142if(c%8==0){43pucchar(‘‘);44}/*endif*/45}/*endfor*/第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.13程序:按位左移和右移4647putchar(‘\n’);48}/*enddisplayBits*/第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.13程序执行结果Theresultofleftshifting960=0000000000000000

00000011110000008bitspositionsusingtheleftshiftoperator<<is245760=0000000000000011

1100000000000000第10章结构体、共用体、位操作和枚举类型10.9位运算符图10.13程序执行结果Theresultofrightshifting960=0000000000000000

00000011110000008bitspositionsusingtherightshiftoperator<<is3=00000000000000000000000000000011第10章结构体、共用体、位操作和枚举类型10.9位运算符例:将一个整数的二进制位颠倒过来请编写一个程序,颠倒一个无符号整数的二进制位的顺序。该程序请用户输入一个无符号整数值,然后调用函数reverseBits来打印其反序的二进制位。按二进制格式打印该整数颠倒处理前后的值,以验证数位已被正确地颠倒了。第10章结构体、共用体、位操作和枚举类型10.9位运算符例:将一个整数的二进制位颠倒过来/*hw10_17.c*/#include<stdio.h>#include<ctype.h>

voiddisplayBits(unsignedvalue);voidreverseBits(unsignedvalue);

第10章结构体、共用体、位操作和枚举类型10.9位运算符例:将一个整数的二进制位颠倒过来intmain(){

unsignedintu;

printf("请输入一个无符号整型数:");

scanf("%u",&u);

printf("%u的二进制编码是:\n",u);

displayBits(u);第10章结构体、共用体、位操作和枚举类型10.9位运算符例:将一个整数的二进制位颠倒过来

printf("%u的反序二进制编码是:\n",

u);

reverseBits(u);

printf("\n");

return0;}/*endmain*/第10章结构体、共用体、位操作和枚举类型10.9位运算符例:将一个整数的二进制位颠倒过来voiddisplayBits(unsignedvalue){

unsignedc;

unsigneddisplayMask=1<<31;

printf("%10u=",value);

第10章结构体、共用体、位操作和枚举类型10.9位运算符例:将一个整数的二进制位颠倒过来/*loopthroughbits*/for(c=1;c<=32;c++) {

putchar(value&displayMask?

'1':'0');value<<=1;

if(c%8==0){

putchar('');第10章结构体、共用体、位操作和枚举类型10.9位运算符例:将一个整数的二进制

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论