版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第十三章 位運(yùn)算,,學(xué)習(xí)目標(biāo),位運(yùn)算的有關(guān)概念和運(yùn)算規(guī)律位段的概念,課程內(nèi)容,13.1 概述13.2 位運(yùn)算符和位運(yùn)算13.3位段,13.1 概述,C語(yǔ)言程序設(shè)計(jì)最大的一個(gè)特點(diǎn)就是可以對(duì)計(jì)算機(jī)硬件進(jìn)行操作,其操作主要是通過(guò)位運(yùn)算實(shí)現(xiàn)的。位運(yùn)算很適合編寫(xiě)系統(tǒng)軟件的需要,是C語(yǔ)言的重要特色。在計(jì)算機(jī)用于檢測(cè)和控制領(lǐng)域中要用到位運(yùn)算的知識(shí)。所謂位運(yùn)算就是指進(jìn)行二進(jìn)制的運(yùn)算。在系統(tǒng)軟件中,常要處理二進(jìn)制的問(wèn)題。例如,將一個(gè)存儲(chǔ)單元
2、中的各二進(jìn)制左移或者右移一位,兩個(gè)數(shù)按位相加等。C語(yǔ)言提供位運(yùn)算的功能,與其他高級(jí)語(yǔ)言相比,顯然具有很大的優(yōu)越性。,C語(yǔ)言提供6種位運(yùn)算符,說(shuō)明:(1)"~"為單目運(yùn)算符,其余均為雙目運(yùn)算符,優(yōu)先級(jí)高低順序: 按位求反~ 移位 按位與& 按位異或^ 按位或|(2)運(yùn)算量只能是整型或字符型數(shù)據(jù),浮點(diǎn)數(shù)不能參與運(yùn)算 (3)參與運(yùn)算時(shí),操作數(shù)都
3、必須轉(zhuǎn)換成二進(jìn)制形式,然后再執(zhí)行按位運(yùn)算,13.2 位運(yùn)算符和位運(yùn)算,如果左移出的位不是1,則左移操作相當(dāng)于乘法操作,左移一位相當(dāng)于原數(shù)乘以2,左移n位,則相當(dāng)于原數(shù)乘以2n,左移位運(yùn)算符 <<格式:x<<位數(shù)規(guī)則:使操作數(shù)的各位左移,低位補(bǔ)0,高位溢出。例:5<<2= 20,右移位運(yùn)算符 >>格式:x>>位數(shù)規(guī)則:使操作數(shù)的各位右移,移出的低位舍棄,高位補(bǔ)符號(hào)
4、位。例:20 >>2= 5,左移操作相當(dāng)于除法操作,右移一位相當(dāng)于原數(shù)除以2,右移n位,則相當(dāng)于原數(shù)除以2n,【例13.1】左移位1 #include 2 void main()3 {4 int a=-1;5 int i=0;6 for (i=0; i<17; i++)7 {8printf("%d<<%d=%d\t", a, i, a&l
5、t;<i);9printf("0x%x<<%d=0x%x\n", a, i, a<<i);10 }11 },運(yùn)行結(jié)果如下:-1<<0=-10xffff<<0=0xffff-1<<1=-20xffff<<1=0xfffe-1<<2=-40xffff<<2=0xfffc-1<<3=
6、-80xffff<<3=0xfff8-1<<4=-160xffff<<4=0xfff0-1<<5=-320xffff<<5=0xffe0-1<<6=-640xffff<<6=0xffc0-1<<7=-1280xffff<<7=0xff80-1<<8=-2560xffff<<8=0xff
7、00-1<<9=-5120xffff<<9=0xfe00-1<<10=-1024 0xffff<<10=0xfc00-1<<11=-20480xffff<<11=0xf800-1<<12=-40960xffff<<12=0xf000-1<<13=-81920xffff<<13=0xe000-1&
8、lt;<14=-16384 0xffff<<14=0xc000-1<<15=-32768 0xffff<<15=0x8000-1<<16=0 0xffff<<16=0x0,整型數(shù)據(jù)是采用補(bǔ)碼表示的。每左移一位相當(dāng)于數(shù)據(jù)乘以2,當(dāng)移位結(jié)果超出數(shù)據(jù)表示范圍時(shí),結(jié)果就不再正確。,【例13.2】右移位1 #include 2 void main()3 {4
9、 int a=0xc57f;5 int i;6 for (i=0; i>%d=%d\t", a, i, a>>i);9printf("0x%x>>%d=0x%x\n", a, i, a>>i);10 }11 },運(yùn)行結(jié)果如下:-14977>>0=-14977 0xc57f>>0=0xc57f-1497
10、7>>1=-7489 0xc57f>>1=0xe2bf-14977>>2=-3745 0xc57f>>2=0xf15f-14977>>3=-1873 0xc57f>>3=0xf8af-14977>>4=-937 0xc57f>>4=0xfc57-14977>>5=-469 0xc57f>>5=
11、0xfe2b-14977>>6=-235 0xc57f>>6=0xff15-14977>>7=-118 0xc57f>>7=0xff8a-14977>>8=-59 0xc57f>>8=0xffc5-14977>>9=-30 0xc57f>>9=0xffe2-14977>>10=-15
12、 0xc57f>>10=0xfff1-14977>>11=-8 0xc57f>>11=0xfff8-14977>>12=-4 0xc57f>>12=0xfffc-14977>>13=-2 0xc57f>>13=0xfffe-14977>>14=-1 0xc57f>>14=0xffff
13、-14977>>15=-1 0xc57f>>15=0xffff,整數(shù)-14977的補(bǔ)碼是0xc57f。整型數(shù)據(jù)每右移一位相當(dāng)于數(shù)據(jù)除以2,同時(shí)還注意到-1/2=-1。,其他位運(yùn)算 除了移位運(yùn)算,二進(jìn)制數(shù)據(jù)的位運(yùn)算還包括與、或、非、異或四種類(lèi)型。 從數(shù)據(jù)本身的角度來(lái)看,位運(yùn)算本身的意義不大。但是在跟計(jì)算機(jī)硬件相關(guān)的很多操作中,位運(yùn)算有其他運(yùn)算無(wú)可比擬的優(yōu)勢(shì)。,位運(yùn)算真值表,【例13.3】
14、將數(shù)據(jù)的最末位置位為0。 1 #include 2 void main()3 {4 int aValue;5 int i;6 for (i=0; i<5; i++)7 {8 printf("Please input a integer:");9 scanf("%d", &aValue)
15、;10 aValue=aValue&0xfffe;11 printf("The new value is:%d\n", aValue);12 }13 },運(yùn)行結(jié)果如下:Please input a integer:19↙The new value is:18Please input a integer:1221↙The new value is:1220
16、Please input a integer:12↙The new value is:12Please input a integer:17↙The new value is:16Please input a integer:400↙The new value is:400,【例13.4】字符串的簡(jiǎn)單加密1#include 2#include 3void main()4{5char maskChar=0
17、x55;6char *sourceString="Hello";7char *destString1;8char *destString2;9int i;10destString1=malloc(strlen(sourceString));11destString2=malloc(strlen(sourceString));12for (i=0; i<strlen(so
18、urceString); i++)13destString1[i]=sourceString[i]^maskChar;14destString1[i]='\0';15for (i=0; i<strlen(sourceString); i++)16destString2[i]=destString1[i]^maskChar;17destString2[i]='\0';
19、18printf("sourceString=%s\n", sourceString);19printf("destString1=%s\n", destString1);20printf("destString2=%s\n", destString2);21},運(yùn)行結(jié)果如下:sourceString=HellodestString1=?099:de
20、stString2=Hello,【例13.5】AD574是一種A/D轉(zhuǎn)換器,它的作用就是將模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào)。它對(duì)外有2個(gè)端口,分別叫作偶地址端口和奇地址端口。向偶地址端口發(fā)送命令可以啟動(dòng)A/D轉(zhuǎn)換,從偶地址端口讀取數(shù)據(jù)可以獲取A/D轉(zhuǎn)換是否完成的狀態(tài)。在A/D完成后,從偶地址可以獲取轉(zhuǎn)換數(shù)據(jù)的高8位數(shù)據(jù),從奇地址可以獲取低4位數(shù)據(jù)。假設(shè)根據(jù)硬件連接情況,得到端口地址0x500和0x501。在C語(yǔ)言的庫(kù)函數(shù)中,有訪(fǎng)問(wèn)外設(shè)端口的out
21、portb函數(shù),它將一個(gè)字節(jié)數(shù)據(jù)寫(xiě)入外設(shè)端口寄存器。inportb函數(shù)把端口寄存器中一個(gè)字節(jié)讀入CPU。下面的程序給出了一個(gè)數(shù)據(jù)采集函數(shù)。1unsigned ad_convert ()2{3unsigned ad_h8 = 0 ;4unsigned ad_L4 = 0 ;5unsigned ad_result = 0;6outportb(0x500 ,0xff);7while (inport
22、b(0x500) &&0x80);8ad_h8 = (unsigned) inportb(0x500) ;9ad_L4 = (unsigned) inportb(0x501) ;10ad_h8 = ad_h8>4 ;12ad_result = ad_h8 + ad_L4 ;13return(ad_result) ;14},13.3 位段,我們知道計(jì)算機(jī)中信息的存儲(chǔ)一般是以字節(jié)為單位
23、的。實(shí)際上,有時(shí)一個(gè)信息本身可能用不到那么多位。例如,要表示人的性別只需1位二進(jìn)制數(shù)據(jù)就可以,譬如0代表“男”,1代表“女”。再例如在過(guò)程控制領(lǐng)域,一個(gè)字節(jié)的數(shù)據(jù)可以表示多個(gè)命令或者設(shè)備的多個(gè)狀態(tài)特征。雖然可以用移位或其他位運(yùn)算組合成我們需要的信息,但是,C語(yǔ)言提供了更方便的利用位段結(jié)構(gòu)處理信息的方法。,位段:在一個(gè)結(jié)構(gòu)體中可以以位為單位來(lái)指定 其成員所占內(nèi)存長(zhǎng)度,這種以位為單位 的成員
24、稱(chēng)為位段(或位域)。,如:struct packed_data { unsigned a : 2; unsigned b : 3; unsigned c : 4; int i; }data;,位段的引用:,結(jié)構(gòu)體變量名. 位段成員名,如:struct packed_data { unsigned a : 2;
25、 unsigned b : 3; unsigned c : 4; int i; }data;,位段的引用如下: data.a=2; data.b=7; data.c=9;,【例13.6】定義位段1typedef struct2{3unsigned a:3;4unsigned b:1;5unsi
26、gned c:7;6}Some_bits;7#include 8void main()9{10Some_bits theseBits;11unsigned int *pInteger;12pInteger=(unsigned int *)&theseBits;13*pInteger=0;14theseBits.a=6;15theseBits.b=1;16theseBits
27、.c=16;17printf("sizeof(Some_bits)=%d\n",sizeof(Some_bits));18printf("*pInteger=%x\n",*pInteger);19printf("%u,%u,%u\n",theseBits.a, theseBits.b, theseBits.c);20},,位段的定義,位段的賦值,位段的引用
28、,運(yùn)行結(jié)果如下:sizeof(Some_bits)=2*pInteger=10e6,1,16,有定義的位段位于整個(gè)結(jié)構(gòu)數(shù)據(jù)的低位。,,在位段中定義無(wú)名字段含義:跳過(guò)該字節(jié)剩余的位或指定的位不用。 當(dāng)無(wú)名字長(zhǎng)度為0時(shí),跳過(guò)該字節(jié)剩余的位不用;當(dāng)無(wú)名字段長(zhǎng)度為n時(shí),跳過(guò)n位不用。,如:struct packed_data { unsigned a : 2; unsigne
29、d b : 3; unsigned : 0; unsigned c : 4; int i; }data;,【例13.7】未命名位段舉例。1typedef struct2{3unsigned a:3;4unsigned :2;5unsigned b:1;6unsigned :0;7unsigned c:7;8
30、}Unamed_bits;9#include 10void main()11{12Unamed_bits theseBits;13unsigned int *pInteger;14pInteger=(unsigned int *)&theseBits;15*pInteger=0;16theseBits.a=6;17theseBits.b=1;18theseBits.c=16
31、;19printf("sizeof(Unamed_bits)=%d\n", sizeof(Unamed_bits));20printf("*pInteger=%x\n", *pInteger);21printf("%u,%u,%u\n", theseBits.a, theseBits.b, theseBits.c);22},運(yùn)行結(jié)果如下:sizeof(U
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 第12章 位運(yùn)算
- 第09章 位運(yùn)算
- 第13章 內(nèi)能
- 第13章.doc
- 第13章 波動(dòng)光學(xué)
- 第13章中斷系統(tǒng)
- 第13章團(tuán)隊(duì)管理
- 第13章作業(yè).pdf
- 第3章 數(shù)據(jù)與數(shù)據(jù)運(yùn)算
- 第13章文件操作
- 第13章實(shí)數(shù)教案
- matlab運(yùn)算基礎(chǔ)(第2章)答案
- 第4章集成運(yùn)算放大電路
- 第13章課后練習(xí)
- 第13章熱力學(xué)
- 第13章急癥兒童護(hù)理
- 第13章實(shí)數(shù)全章導(dǎo)學(xué)案[1]
- 西方經(jīng)濟(jì)學(xué)第13章(宏觀第2章)
- 第13章練習(xí)題
- 第13章、測(cè)羅經(jīng)差
評(píng)論
0/150
提交評(píng)論