位運算(人民郵電管銀枝主篇).ppt_第1頁
位運算(人民郵電管銀枝主篇).ppt_第2頁
位運算(人民郵電管銀枝主篇).ppt_第3頁
位運算(人民郵電管銀枝主篇).ppt_第4頁
位運算(人民郵電管銀枝主篇).ppt_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第十一 位運算,C語言既具有高級語言的特點,也具有低級語言的特點。本節(jié)所講的位運算就具有低級語言的特點,并被廣泛用于對底層硬件、外圍設(shè)備的狀態(tài)檢測和控制。 計算機真正執(zhí)行的是由0和1信號組成的計算機指令,數(shù)據(jù)也是以二進制形式表示的。因此最終要實現(xiàn)計算機的操作,就要對這些0和1進行操作。每一個0和1的狀態(tài)稱為一個“位”(bit)的狀態(tài)。有了位運算,C語言就能編寫出直接對計算機硬件進行操作的程序。,本章主要內(nèi)容,11.1 位運算及位運算符概述 11.2 位運算 11.3 位域 11.4 位運算應(yīng)用舉例,11.1位運算及位運算符概述,11.1.1 位運算概述 所謂位運算是指對操作數(shù)以二進制位(bit

2、)為單位進行的數(shù)據(jù)處理。每一個二進制位只能存放1位二進制數(shù)“0”或“1”,因此位運算符的運算對象是一個二進制數(shù)位的集合。 通常把組成一個數(shù)據(jù)的最右邊的二進制位稱作第0位,從右向左依次稱為第1位,第2位,最左邊一位稱作最高位。,1112位運算符位的種類,C語言中,位運算包括邏輯位運算和移位位運算。 1、邏輯位運算分為四種:位反、位與、位或、位異 2、移位位運算分為二種:左移與右移。 在c語言中的移位不是循環(huán)移動,經(jīng)過移位后一端的位被“擠掉”,而另一端空出的位補0。,3、位復(fù)合賦值運算符 類似于算術(shù)的復(fù)合運算符,位運算符和賦值運算符也可以構(gòu)成復(fù)合賦值運算符。,4、關(guān)于位運算符的幾點說明 (1)在邏

3、輯位運算中,的優(yōu)先級高于算術(shù)運算符、關(guān)系運算符、邏輯運算符, 其他位運算符則低于關(guān)系運算符、高于邏輯運算符。 (2)參加位運算的操作數(shù)必須是整型或字符型數(shù)據(jù)(常量或變量),不能是其它類型的數(shù)據(jù)。 (3)兩個長度不同的數(shù)據(jù)進行位運算時,系統(tǒng)先將兩者的右端對齊,短的運算對象若是有符號數(shù)則按符號位擴展,若是無符號數(shù)則以“0”擴充。 (4)位運算符的優(yōu)先級如下:按位取反運算符“”的優(yōu)先級最高,高于所有的雙目運算符;其次是左移運算符“”,其優(yōu)先級高于關(guān)系運算符;最低的是按位與“ int mask,i,count=0; printf(請輸入一個字符:); ch=getchar(); printf(該字符的

4、ASCII是%dn,ch); mask=0 x80; for(i=0;i=1; printf(ASCII中1的個數(shù)有: %dn,count); getch(); ,11.2 1 按位取反運算,按位取反運算是用來對二進制按位進行取反運算,是單目運算符。按位取反運算符用“”表示。按位取反運算符是位運算中惟一的單目運算符,運算對象應(yīng)置于運算符的右邊。 1、按位取反運算的運算規(guī)則 按位取反運算的運算規(guī)則:把運算對象的內(nèi)容按位取反,將每一位上的0變1,1變0。 即0=1,1=0。 例如:對十六進制數(shù)32進行取反。 0 0 1 1 0 0 1 0=1 1 0 0 1 1 0 1 結(jié)果為1 1 0 0 1

5、1 0 1。 又如: a=0000 0000 0000 1011,則表達式a的值為1111 1111 1111 0100。 unsigned char a,b; /*定義兩個無符號字符型變量a,b* b=a /*對變量a全部位取反,結(jié)果賦值給b*/ printf(a =%dn,b); /*輸出十進制b值*/,2、按位取反運算的主要應(yīng)用 按位取反運算的主要應(yīng)用:用來適應(yīng)不同字長型號的機型,幫助得到使原數(shù)最低位為0。例如:想使a中最低位為0,可讓a=a c=a 運行結(jié)果: a=264,b=255,c=13 (2)測試指定位的值:要判斷某一指定位的值是否為1或0,只需將這一位與1進行“按位與”操作,

6、然后判斷結(jié)果是否為1或0即可。,例:設(shè)x是一個字符型變量(8位二進制位),判斷x的最低位是否為1。 方法是:把x和0 x01進行“按位與”運算,如果結(jié)果為1則x的最低位是1。 x =* * * * * * * * 運行結(jié)果: x=268,y=1,z=0 應(yīng)當(dāng)注意:“按位與”運算 z=x|y; printf(x=%d,y=%d,z=%dn,x,y,z); ,11.2.4 按位異或運算,按位異或運算符是指參與運算的兩個數(shù)對應(yīng)的二進制位進行邏輯按位異或的操作,用“”表示。 1、按位異或運算符的運算規(guī)則 按位異或運算符的運算規(guī)則:若兩個運算對象的對應(yīng)二進制位不同,則結(jié)果的對應(yīng)數(shù)位為1,否則為0。按位異

7、或運算可能的運算組合及其運算結(jié)果如下所示: 00=0 10=1 01=1 11=0 例如,x=0000 0000 0000 1011,y=0000 0000 0000 1010,則表達式xy的計算結(jié)果如下:,又如: c=106 10: 0000,0000,0000,1010 printf(請輸入一個十六進制數(shù)a:n); scanf(%x, ,11.2.5 左移運算,左移運算符是把“”符號左邊的運算數(shù)的各二進制位全部左移若干位,移動的若干位由“”符號右邊的數(shù)指定,高位丟棄,低位補0,用“”表示。 1、左移運算符的運算規(guī)則 左移運算符的運算規(guī)則:將運算對象中的每個二進制數(shù)位向左移動若干位,從左邊移

8、出去的高位部分被丟棄,右邊空出的低位部分用“0”補齊。 例如:x=0000 0000 0000 1011,則x2的結(jié)果為0000 0000 0010 1100。 又例如:左移運算舉例: char a=30; a=a2; 結(jié)果如下: (30)=(0001,1110)(二進制) 左移后為(120)=(0111,1000)(二進制),注意: 若移出的高位部分不包含數(shù)位1,則每左移1位,相當(dāng)于乖2,左移n 位相當(dāng)于乖2的n次方。 若對c=44(00101100)進行下面的操作: c=c1;c的值變?yōu)?8(01011000) c=c1;c的值變?yōu)?76(10110000),11.2.6 右移運算,右移運

9、算符把運算符左邊的運算數(shù)的各二進制位全部右移若干位,用“”表示,移動的若干位由“”符號右邊的數(shù)指定。 右移運算符的運算規(guī)則:將運算對象中的每個二進制數(shù)位向右移動若干位,從右邊移出去的低位部分被丟棄,左邊空出的高位部分的處理分兩種情況。對無符號數(shù)和正數(shù)來講,左邊空出的高位部分補“0”;對負數(shù)來講,左邊空出的高位部分補“0”還是補“1”,與所使用的編譯程序有關(guān),有的編譯程序補“0”,稱為邏輯右移,有的編譯程序補“1”,稱為算術(shù)右移。 例如: char a=0 x78; a=a2; 結(jié)果如下: 16進制78=120=(0111,1000)(二進制) 右移后為:(30)=(0001,1110)(二進制

10、),應(yīng)當(dāng)注意: (1)若移出的位全為0,則每右移1位,相當(dāng)于除2,右移n 位相當(dāng)于除2的n次方。 (2)當(dāng)進行右移運算時,操作結(jié)果與操作數(shù)是否帶符號有關(guān)。 v無符號操作數(shù)右移時,左端出現(xiàn)的空位補0,右端移出的數(shù)據(jù)舍去。 v帶符號操作數(shù)右移時,左端出現(xiàn)的空位補符號位。若符號位為0則左邊也是移入0,若符號位為1則左端也是移入1,移出的數(shù)據(jù)舍去。 例如:帶符號數(shù)a=16和無符號數(shù)b=240,進行下列操作: a=a1;a的值變?yōu)?(11111000) b=b1;b的值變?yōu)?20(01111000) a=a1;a的值變?yōu)?(11111100) b=b1;b的值變?yōu)?0(00111100),11.3 位域

11、,在程序設(shè)計中,有時存儲一個信息不必用一個或多個字節(jié),可以在一個字節(jié)中存放一個或多個信息。例如,“真”或“假”用1或0表示,只需一位即可,如果用一個變量來存儲,則將浪費存儲空間。為了解決該問題,C語言提供了位段操作。 在前面介紹的位與運算、位或運算、位異或運算、反運算、左移運算、右移運算等幾種的綜合運算,可以實現(xiàn)對某一位或某幾位的存取,但較麻煩。c語言中允許在結(jié)構(gòu)體中以位為單位來指定其成員所占的內(nèi)存長度,這種以位為單位的成員就稱為位段或位域(bit field)。 所謂位段是由一個或多個二進制數(shù)位組成的,它是數(shù)據(jù)的一種壓縮形式。位段是一種特殊的壓縮形式結(jié)構(gòu)體結(jié)構(gòu)中的成員,它的特殊性在于它是以位

12、為單位定義長度的。,11.3.1 位域或位段(bit field)的定義形式,c語言中允許在結(jié)構(gòu)體中以位為單位來指定其成員所占的內(nèi)存長度,這種以位為單位的成員就稱為位段或位域(bit field)。 所謂位段是由一個或多個二進制數(shù)位組成的,它是數(shù)據(jù)的一種壓縮形式。位段是一種特殊的壓縮形式結(jié)構(gòu)體結(jié)構(gòu)中的成員,它的特殊性在于它是以位為單位定義長度的。,11.3.1 位域或位段(bit field)的定義形式,位域或位段(bit field)的定義形式如下: struct 位域結(jié)構(gòu)體名 位域列表 其中,位域列表的形式為: 類型說明符 位域名:位域長度; 其中,位域名的類型必須指定為unsigned

13、int 型或int型,一般為unsigned型。位域長度以二進制位為單位。例如: struct bs unsigned int a:1; unsigned int b:3; unsigned int c:4; bit,*pbit; 定義了結(jié)構(gòu)體bs,該結(jié)構(gòu)體變量共有3個成員,其中a,b,c成員是位段,分別占1位、3位、4位,共占1個字節(jié)。,又如: struct wd unsigned a:2; unsigned b:3; unsigned c:6; unsigned d:4; int k; dat; 定義了結(jié)構(gòu)體wd,該結(jié)構(gòu)體變量共有5個成員,其中a、b、c、d成員是位段,分別占2位、3位、6

14、位、4位,k是的一般成員,k占2個字節(jié)。,11.3.2 位域的引用,位域的引用方法與引用結(jié)構(gòu)體變量中的成員相同,即: 位域結(jié)構(gòu)體名.位域名 在C語言中,可以通過賦值語句給位域賦值。例如: struct bs unsined a:6; int b:2; int c:8; data; 這里定義一個位域結(jié)構(gòu)bs,同時定義了data為bs變量,共占兩個字節(jié)。其中位域a占6位,b占2位,c占8位。 位域中數(shù)據(jù)的引用為: data.a=7; data.b=1; data.c=9;,注意:,1、賦值時不能超過位域允許的最大值范圍,如data.b 只占2個位,最大值為3,此時若把8(二進制為1000)賦給它,

15、就會自動取賦予該數(shù)的低位,也是就00,最終data.b的值為0。 2、位域還可以用整型格式符輸出。例如: printf(“%d,%d,%dn”,data.a,data.b,data.c); 也可以用%u、%o、%x等格式符輸出。,11.4 位運算應(yīng)用舉例,例:從鍵盤上輸入一個正整數(shù)n,判斷此數(shù)是奇數(shù)還是偶數(shù)。 分析:奇數(shù)的二進制表示中右邊的第1位為1,偶數(shù)的二進制表示中右邊的第1位為0。因此該題就轉(zhuǎn)換為取該數(shù)右邊的第1位,并判斷其值是否為0。 程序清單如下: main( ) int n; printf(請輸入一個大于0的數(shù) n:); scanf(%d, ,例:將十六進制數(shù)轉(zhuǎn)換為二進制數(shù)。,分析

16、:人們有時希望知道某個十六進制數(shù)的二進制數(shù)是什么,但C語言的printf()函數(shù)只提供%x,%d,%o方式輸出一個整數(shù)(即十六進制,十進制,八進制)而不能直接輸出一個整數(shù)的二進制形式,需要人工轉(zhuǎn)換,很不方便。在這里可以用位運算來實現(xiàn)此功能。 采用的方法是:對一個整數(shù)num(16位)的每一位進行測試,視其為0還是為1,可以設(shè)置一個屏蔽字與該數(shù)進行 該bit的值(非1即0)就是num第15位之值。下面處理第14位,此時mask應(yīng)改為0 x4000,也就是使mask右移一位。,main() int j,num,bit; unsigned int mask; mask=0 x8000; printf(n請輸入一個數(shù)十六進制的數(shù):); scanf(%x, ,本章小結(jié),C語言是為了描述系統(tǒng)而設(shè)計的,它既具有高級語言

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論