C語言程序設(shè)計(jì)-第12章-位運(yùn)算_第1頁
C語言程序設(shè)計(jì)-第12章-位運(yùn)算_第2頁
C語言程序設(shè)計(jì)-第12章-位運(yùn)算_第3頁
C語言程序設(shè)計(jì)-第12章-位運(yùn)算_第4頁
C語言程序設(shè)計(jì)-第12章-位運(yùn)算_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

位運(yùn)算第12章本章內(nèi)容位運(yùn)算符和位運(yùn)算位運(yùn)算舉例位段基本概念概念位運(yùn)算是指按二進(jìn)制位進(jìn)行的運(yùn)算。因?yàn)樵谙到y(tǒng)軟件中,常要處理二進(jìn)制位的問題。 例如:將一個(gè)存儲(chǔ)單元中的各二進(jìn)制位左移或右移一位,兩個(gè)數(shù)按位相加等。C語言提供位運(yùn)算的功能,與其他高級(jí)語言(如PASCAL)相比,具有很大的優(yōu)越性。12.1位運(yùn)算符和位運(yùn)算C語言提供的位運(yùn)算符說明:位運(yùn)算符中除~以外,均為二目(元)運(yùn)算符,即要求兩側(cè)各有一個(gè)運(yùn)算量。運(yùn)算量只能是整型或字符型的數(shù)據(jù),不能為實(shí)型數(shù)據(jù)。運(yùn)算符含義運(yùn)算符含義

&按位與~取反|按位或<<左移∧按位異或>>右移12.1位運(yùn)算符和位運(yùn)算"按位與"運(yùn)算符(&)"按位與"運(yùn)算規(guī)則 如果兩個(gè)相應(yīng)的二進(jìn)制位都為1,則該位的結(jié)果值為1;否則為0。即: 0&0=0,0&1=0,1&0=0,1&1=1例:3&5并不等于8,應(yīng)該是按位與運(yùn)算:注意:如果參加&運(yùn)算的是負(fù)數(shù)(如-3&-5),則要以補(bǔ)碼形式表示為二進(jìn)制數(shù),然后再按位進(jìn)行"與"運(yùn)算。00000011(3)&00000101(5)00000001(1)3&5的值得112.1位運(yùn)算符和位運(yùn)算按位與的用途清零使一個(gè)存儲(chǔ)單元清零,即使其全部二進(jìn)制位為0。找一個(gè)二進(jìn)制數(shù),符合以下條件:原來的數(shù)中為1的位相應(yīng)位為0。然后使二者進(jìn)行&運(yùn)算即可。 例:原有數(shù)為00101011,另找一個(gè)數(shù),設(shè)它為10010100,將這兩個(gè)數(shù)進(jìn)行&運(yùn)算:00101011&1001010000000000

12.1位運(yùn)算符和位運(yùn)算取一個(gè)數(shù)中某些指定位 如有一個(gè)整數(shù)a(2個(gè)字節(jié)),想要取其中的低字節(jié),只需將

a與255(8個(gè)1)按位與即可。保留一位 與一個(gè)數(shù)進(jìn)行&運(yùn)算,此數(shù)在該位取1。 例如:有一數(shù)01010100,想把其中左面第3、4、5、7、8位保留下來,運(yùn)算如下:0010110010101100abc00000000111111110000000010101100即:a=84,b=59c=a&b=1601010100(84)&00111011(59)00010000(16)12.1位運(yùn)算符和位運(yùn)算"按位或"運(yùn)算符(|)"按位或"運(yùn)算規(guī)則 兩個(gè)相應(yīng)的二進(jìn)制位中只要有一個(gè)為1,該位的結(jié)果值為1。 即0|0=0,0|1=1,1|0=1,1|1=1 例:060|017,將八進(jìn)制數(shù)60與八進(jìn)制數(shù)17進(jìn)行按位或運(yùn)算。應(yīng)用按位或運(yùn)算常用來對(duì)一個(gè)數(shù)據(jù)的某些位置值為1。 例如:如果想使一個(gè)數(shù)a的低4位改為1,只需將a與017進(jìn)行按位或運(yùn)算即可。 例:a是一個(gè)整數(shù)(16位),有表達(dá)式:a|0377或a|0xff

則低8位全置為1,高8位保留原樣。00110000|000011110011111112.1位運(yùn)算符和位運(yùn)算"異或"運(yùn)算符(∧)"異或"運(yùn)算符運(yùn)算規(guī)則 異或運(yùn)算符∧也稱XOR運(yùn)算符。它的規(guī)則是:若參加運(yùn)算的兩個(gè)二進(jìn)制位同號(hào)則結(jié)果為0(假),異號(hào)則結(jié)果為1(真)即按位相加:0∧0=0,0∧1=1,1∧0=1,1∧1=0。例:

即:071∧052=023(八進(jìn)制數(shù))∧運(yùn)算符應(yīng)用使特定位翻轉(zhuǎn) 設(shè)有01111010,想使 其低4位翻轉(zhuǎn),即1變?yōu)椋埃?0變?yōu)椋???梢詫⑺c000 01111進(jìn)行∧運(yùn)算,即: 要使哪幾位翻轉(zhuǎn)就將與其進(jìn)行∧運(yùn)算的該幾位置為1即可。

00111001∧0010101000010011

01111010∧000011110111010112.1位運(yùn)算符和位運(yùn)算與0相∧,保留原值 例如:012∧00=012交換兩個(gè)值,不用臨時(shí)變量

例如:a=3,b=4。互換a和b的值: a=a∧b;

b=b∧a;

a=a∧b;a=011(∧)b=100a=111(a∧b的結(jié)果,a已變成7)(∧)b=100b=011(b∧a的結(jié)果,b已變成3)(∧)a=111a=100(a∧b的結(jié)果,a已變成4)

00001010∧000000000000101012.1位運(yùn)算符和位運(yùn)算"取反"運(yùn)算符(~)

"取反"運(yùn)算符運(yùn)算規(guī)則 ~是一個(gè)單目(元)運(yùn)算符,用來對(duì)一個(gè)二進(jìn)制數(shù)按位取反,即將0變1,將1變0。例如:~025(即00010101)按位求反。~運(yùn)算符應(yīng)用使一個(gè)整數(shù)a的最低一位為0:a=a&~1當(dāng)整數(shù)以2個(gè)字節(jié)存儲(chǔ)時(shí)1的二進(jìn)制形式為:00000000

00000001~1是:11111111

11111110

0000000000010101(~)

1111111111101010(八進(jìn)制數(shù)177752)

0000000000010101&11111111

11111110000000000001010012.1位運(yùn)算符和位運(yùn)算左移運(yùn)算符(<<)<<運(yùn)算符運(yùn)算規(guī)則用來將一個(gè)數(shù)的各二進(jìn)制位全部左移若干位,高位左移后溢出,舍棄。 例如:a=<<2將a的二進(jìn)制數(shù)左移2位,右補(bǔ)0。<<運(yùn)算符應(yīng)用左移時(shí)被溢出舍棄的高位中不包含1時(shí),左移1位相當(dāng)于該數(shù)乘以2,左移2位相當(dāng)于該數(shù)乘以4。左移比乘法運(yùn)算快得多,有些C編譯程序自動(dòng)將乘2n

的冪運(yùn)算處理為左移n位。 例如:a=15,即二進(jìn)制數(shù)00001111,左移2位:00111100(十進(jìn)制數(shù)60)。 假設(shè)以一個(gè)字節(jié)(8位)存一個(gè)整數(shù),若a為無符號(hào)整型變量,則a=64時(shí),

01000000 a<<1:0溢出,1000000 a<<2:01溢出,00000012.1位運(yùn)算符和位運(yùn)算右移運(yùn)算符(>>)>>運(yùn)算符運(yùn)算規(guī)則右移運(yùn)算符用來將一個(gè)數(shù)的各二進(jìn)制位全部右移若干位,移到右端的低位被舍棄,對(duì)無符號(hào)數(shù),高位補(bǔ)0。 例如:a=017:00001111,

a>>2:00000011>>運(yùn)算符應(yīng)用右移一位相當(dāng)于除以2,右移n位相當(dāng)于除以2n。注意符號(hào)位問題對(duì)無符號(hào)數(shù),右移時(shí)左邊高位移入0;對(duì)于有符號(hào)的值,如果原來符號(hào)位為0(該數(shù)為正),則左邊也是移入0。如果符號(hào)位原來為1(即負(fù)數(shù)),則左邊移入0還是1,要取決于所用的計(jì)算機(jī)系統(tǒng)。移入0的稱為"邏輯右移",即簡(jiǎn)單右移;移入1的稱為"算術(shù)右移"。12.1位運(yùn)算符和位運(yùn)算 例如:

a的值是八進(jìn)制數(shù)113755:

a:1001011111101101(用二進(jìn)制形式表示)

a>>1:0100101111110110(邏輯右移時(shí)) a>>1:1100101111110110(算術(shù)右移時(shí))在有些系統(tǒng)中,a>>1得八進(jìn)制數(shù)045766,而在另一些系統(tǒng)上可能得到的是145766。TurboC和其他一些C編譯采用的是算術(shù)右移,即對(duì)有符號(hào)數(shù)右移時(shí),如果符號(hào)位原來為1,左面移入高位的是1。12.1位運(yùn)算符和位運(yùn)算位運(yùn)算賦值位運(yùn)算符與賦值運(yùn)算符可以組成復(fù)合賦值運(yùn)算符。例如:&=,|=,>>=,<<=,∧=

例:a&=b

相當(dāng)于a=a&b a<<=2

相當(dāng)于a=a<<2不同長度的數(shù)據(jù)進(jìn)行位運(yùn)算如果兩個(gè)數(shù)據(jù)長度不同(例如long型和int型),進(jìn)行位運(yùn)算時(shí)(如a&b,而a為long型,b為int型),系統(tǒng)會(huì)將二者按右端對(duì)齊。如果b為正數(shù),則左側(cè)16位補(bǔ)滿0;若b為負(fù)數(shù),左端應(yīng)補(bǔ)滿1;如果b為無符號(hào)整數(shù)型,則左側(cè)添滿0。12.2位運(yùn)算舉例例12.1:取一個(gè)整數(shù)a從右端開始的4~7位先使a右移4位:a>>4

目的:使要取出的那幾位移到最右端設(shè)置一個(gè)低4位全為1,其余全為0的數(shù)。

~(~0<<4)將上面式子進(jìn)行&運(yùn)算。

(a>>4)&~(~0<<4)未右移時(shí)的情況右移4位后的情況12.2位運(yùn)算舉例程序如下:#include<stdio.h>voidmain(){unsigneda,b,c,d;

scanf("%o",&a);b=a>>4;c=~(~0<<4);d=b&c;

printf("%o,%d\n%o,%d\n",a,a,d,d);}運(yùn)行情況如下:331(輸入)13(d的值)輸入a的值為八進(jìn)制數(shù)331,其二進(jìn)制形式為11011001經(jīng)運(yùn)算最后得到的d為00001101即八進(jìn)制數(shù)15,十進(jìn)制數(shù)13。12.2位運(yùn)算舉例例12.2:循環(huán)移位。 要求將a進(jìn)行右循環(huán)移位。 將a右循環(huán)移n位,即將a中原來左面(16-n)位右移n位,原來右端n位移到最左面n位。步驟:將a的右端n位先放到b中的高n位中,實(shí)現(xiàn)語句:b=a<<(16-n);將a右移n位,其左面高位n位補(bǔ)0,實(shí)現(xiàn)語句:c=a>>n;將c與b進(jìn)行按位或運(yùn)算,即c=c|b;12.2位運(yùn)算舉例程序如下:#include<stdio.h>voidmain(){unsigneda,b,c;

intn;

scanf("a=%o,n=%d",&a,&n);b=a<<(16-n);c=a>>n;c=c|b;

printf("%o\n%o",a,c);}運(yùn)行情況如下:a=157653,n=315765375765

運(yùn)行開始時(shí)輸入八進(jìn)制數(shù)157653,即二進(jìn)制數(shù)1101111110101011循環(huán)右移3位后得二進(jìn)制數(shù)0111101111110101即八進(jìn)制數(shù)75765

12.3位段背景信息的存取一般以字節(jié)為單位。有時(shí)存儲(chǔ)一個(gè)信息不必用一個(gè)或多個(gè)字節(jié),如"真"或"假"用0或1表示,只需1位即可。在計(jì)算機(jī)用于過程控制、參數(shù)檢測(cè)或數(shù)據(jù)通信領(lǐng)域時(shí),控制信息往往只占一個(gè)字節(jié)中的一個(gè)或幾個(gè)二進(jìn)制位,常常在一個(gè)字節(jié)中放幾個(gè)信息。問題如何向一個(gè)字節(jié)中的一個(gè)或幾個(gè)二進(jìn)制位賦值和改變它的值?解決方法人為地將一個(gè)整型變量data分為幾部分。舉例:P326缺點(diǎn):太麻煩使用位段結(jié)構(gòu)體。12.3位段位段C語言允許在一個(gè)結(jié)構(gòu)體中以位為單位來指定其成員所占內(nèi)存長度,這種以位為單位的成員稱為"位段"或稱"位域"(bitfield)。利用位段能夠用較少的位數(shù)存儲(chǔ)數(shù)據(jù)。 例如:structpacked-data{unsigneda:2;

unsignedb:6;

unsignedc:4;

unsignedd:4;

int

i;}data12.3位段各位段也可以不恰好占滿一個(gè)字節(jié)。例如:

i從另一字節(jié)開頭起存放。對(duì)位段中數(shù)據(jù)引用的方法。例如:

data.a=2;

data.b=7;

data.c=9;structpacked-data{unsigneda:2;

unsignedb:3;

unsigned

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論