




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
《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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030中國防護網行業市場發展趨勢與前景展望戰略研究報告
- 2025-2030中國鐵路蓄電池行業市場發展趨勢與前景展望戰略研究報告
- 2025-2030中國金融云行業市場發展分析及前景趨勢研究報告
- 2025-2030中國運動保護行業市場發展趨勢與前景展望戰略研究報告
- 2025-2030中國輕型汽車前端模塊行業市場發展趨勢與前景展望戰略研究報告
- 多媒體年終工作總結范文
- 2025-2030中國豪華椅行業市場發展趨勢與前景展望戰略研究報告
- 2025-2030中國認證檢驗檢測行業市場發展分析及前景趨勢與投資研究報告
- 2025-2030中國西式快餐行業市場發展分析及投資前景與投資策略研究報告
- 2025-2030中國蛋白酪氨酸激酶SYK行業市場發展趨勢與前景展望戰略研究報告
- 少兒美術課件紫藤花
- 公司分布式光伏發電項目工程監理實施細則
- 《疫苗管理法》法律法規解讀課件
- 自動跟隨行李箱系統設計
- 手動電葫蘆操作規程
- 創新方法論知到章節答案智慧樹2023年西安理工大學
- 《上海市奉賢區小區機動車停放管理工作調查報告》4300字
- 刑偵工作調研報告
- 火力發電廠鍋爐智能燃燒控制技術導則
- 國家開放大學《社會心理學》形考任務1-4參考答案
- 國家開放大學《現代漢語專題》章節自測參考答案
評論
0/150
提交評論