版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章位運(yùn)算8.1位運(yùn)算與位運(yùn)算符
8.2位段及使用
8.1位運(yùn)算與位運(yùn)算符
C語(yǔ)言中提供了六種位運(yùn)算符,這些運(yùn)算符的運(yùn)算功能和優(yōu)先級(jí)如表8.1所示。表8.1位運(yùn)算符含義注意:只有按位求反運(yùn)算符(~)為單目運(yùn)算符,其余均為雙目運(yùn)算符。當(dāng)兩個(gè)運(yùn)算對(duì)象的位數(shù)不同時(shí),系統(tǒng)將自動(dòng)進(jìn)行如下處理:
①將兩個(gè)運(yùn)算數(shù)右端對(duì)齊;
②將位數(shù)不足的一個(gè)運(yùn)算對(duì)象向高位擴(kuò)充,即無(wú)符號(hào)數(shù)和正整數(shù)左端用0補(bǔ)齊;負(fù)數(shù)左端用1補(bǔ)齊;
(3)對(duì)位數(shù)相等的這兩個(gè)數(shù)按位進(jìn)行運(yùn)算。8.1.1“按位與”運(yùn)算(&)
“按位與”運(yùn)算是將參加運(yùn)算的兩操作對(duì)象,按對(duì)應(yīng)的二進(jìn)制位分別進(jìn)行“邏輯與”運(yùn)算。運(yùn)算規(guī)則為:只有兩個(gè)相應(yīng)位都為1時(shí),該位的運(yùn)算結(jié)果才為1;兩個(gè)相應(yīng)位的值相異或均為0時(shí),該位的運(yùn)算結(jié)果為0。如下所示:
1&1=1
0&1=0
1&0=0
0&0=0
【例8.1】
求表達(dá)式12&10的值。
程序如下:圖8.1例8.1的運(yùn)行結(jié)果圖8.2例8.2的輸出結(jié)果
【例8.3】
從鍵盤輸入一個(gè)整數(shù),判斷此數(shù)是否能被2整除。
問(wèn)題分析:一個(gè)整數(shù)能否被2整除,只需判斷最低位是0還是1。若最低位為0,則該數(shù)能被2整除;若最低位為1,則該數(shù)不能被2整除。
程序如下:圖8.3例8.3的運(yùn)行結(jié)果8.1.2“按位或”運(yùn)算(|)
按位或運(yùn)算是將參加運(yùn)算的兩操作對(duì)象按對(duì)應(yīng)的二進(jìn)制位分別進(jìn)行“邏輯或”運(yùn)算。運(yùn)算規(guī)則:只有兩個(gè)相應(yīng)位都為0時(shí),該位的運(yùn)算結(jié)果才為0,其他情況下,結(jié)果全為1。如下所示:
0?|?0?=?0
1?|?1?=?1
0?|?1?=?1
1?|?0?=?1
【例8.4】
求表達(dá)式12|10的值。
程序如下:圖8.4例8.4的運(yùn)行結(jié)果輸出結(jié)果如圖8.5所示。
圖8.5例8.5的運(yùn)行結(jié)果8.1.3“按位異或”運(yùn)算(^)
按位異或運(yùn)算是將參加運(yùn)算的兩操作對(duì)象按對(duì)應(yīng)的二進(jìn)制位分別進(jìn)行“按位異或”運(yùn)算。運(yùn)算規(guī)則為:參加運(yùn)算的兩個(gè)運(yùn)算量,如果兩個(gè)對(duì)應(yīng)位上的值不同,則該位的結(jié)果為1;如果對(duì)應(yīng)位上的值相同,則該位的結(jié)果為0。如下所示:
1^1=0
0^0=0
1^0=1
0^1=1
例如:求表達(dá)式210^127的值。
運(yùn)算過(guò)程如下:輸出結(jié)果如圖8.6所示。圖8.6例8.6的運(yùn)行結(jié)果
程序說(shuō)明:x=x^y;y=y^x;x=x^y;三條語(yǔ)句相當(dāng)于以下兩步:
①y=y^(x^y)=y^x^y=y^y^x=0^x=x;
②x=x^y=(x^y)^(y^x^y)=x^y^y^x^y=x^x^y^y^y=y。圖8.7例8.7的運(yùn)行結(jié)果8.1.4“按位取反”運(yùn)算(~)
“按位取反”運(yùn)算符“~”是唯一的一個(gè)單目位運(yùn)算符,用來(lái)將一個(gè)二進(jìn)制數(shù)按位取反,即將1變0,將0變1。
運(yùn)算規(guī)則如下:
~1=0
~0=1
【例8.8】
給出一個(gè)數(shù)的原碼,求出該數(shù)的補(bǔ)碼。
問(wèn)題分析:一個(gè)正數(shù)的補(bǔ)碼等于該數(shù)的原碼,一個(gè)負(fù)數(shù)的補(bǔ)碼等于該數(shù)的反碼加1。程序如下:圖8.8例8.8的運(yùn)行結(jié)果8.1.5“左移”運(yùn)算(<<)
左移運(yùn)算的一般形式為
運(yùn)算對(duì)象<<左移位數(shù)
其中,左移運(yùn)算符“<<”是雙目運(yùn)算符,它的作用是將一個(gè)數(shù)的各二進(jìn)制位依次左移若干位(由左移位數(shù)給出),左移時(shí),右端(低位)補(bǔ)0,左端(高位)移出的部分舍去。
設(shè)a=6,則a<<2的值為24。用二進(jìn)制數(shù)表示運(yùn)算過(guò)程如下:
a:00000110(a=6)
a<<2:00011000(b=24=4*6)左移時(shí),若左端移出的部分不包含有效二進(jìn)制數(shù)1,則每左移一位,相當(dāng)于移位對(duì)象乘以2。在某些情況下,可以利用左移的這一特征來(lái)代替乘法運(yùn)算,以加快運(yùn)算速度。
【例8.9】
輸入兩個(gè)1位十進(jìn)制數(shù)字a和b,由a、b組合生成整數(shù)c(c用字符類型表示),并顯示出來(lái)。生成規(guī)則是:a的低4位作為c的高4位,b的低4位作為c的低4位。
問(wèn)題分析:要想用a、b的低4位組成c,需要做以下工作:
①屏蔽掉a、b的高4位;
②a左移4位,使a的低4位成為高4位;
③將a和b拼在一起,形成c。
程序如下:運(yùn)行情況如圖8.9所示。圖8.9例8.9的運(yùn)行結(jié)果8.1.6“右移”運(yùn)算(>>)
右移運(yùn)算的一般形式為
運(yùn)算對(duì)象>>右移位數(shù)
其中,右移運(yùn)算符“>>”是雙目運(yùn)算符,它的作用是將一個(gè)數(shù)的各二進(jìn)制位依次右移若干位(由右移位數(shù)給出),右移時(shí),右端(低位)移出的部分舍去,左端(高位)移入的二進(jìn)制數(shù)分兩種情況:對(duì)于無(wú)符號(hào)數(shù)和正整數(shù),高位補(bǔ)0;對(duì)于負(fù)整數(shù),高位補(bǔ)1。
例如:
inta=5,b=-3,x,y;
x=a>>2;
y=b>>2;用二進(jìn)制數(shù)表示的運(yùn)算過(guò)程如下:
a的二進(jìn)制補(bǔ)碼表示:00000101
x=a>>2:00000001
b的二進(jìn)制補(bǔ)碼表示:11111101
y=b>>2:11111111
8.1.7位復(fù)合賦值運(yùn)算符
位運(yùn)算符和賦值運(yùn)算符也可以構(gòu)成位復(fù)合賦值運(yùn)算符,類似于算術(shù)運(yùn)算的復(fù)合賦值運(yùn)算符,見表8.2。表8.2由位運(yùn)算符構(gòu)成的復(fù)合運(yùn)算符注意:位運(yùn)算的類型可以是整型(int、unsigned或longint)或字符型(char)數(shù)據(jù)。當(dāng)兩個(gè)運(yùn)算對(duì)象的類型不同時(shí)系統(tǒng)會(huì)自動(dòng)進(jìn)行如下處理:
(1)兩個(gè)運(yùn)算對(duì)象按位右對(duì)齊;
(2)較短的運(yùn)算對(duì)象高位符號(hào)擴(kuò)展,即如果是正數(shù),高位補(bǔ)0,如果是負(fù)數(shù),高位補(bǔ)1。
8.2位?段?及?使?用
在計(jì)算機(jī)中一般以字節(jié)為單位存放數(shù)據(jù),但實(shí)際工作中有時(shí)數(shù)據(jù)的表示不必用一個(gè)字節(jié),而僅僅占用一個(gè)字節(jié)的一位或幾位即可。例如,某系統(tǒng)有7種設(shè)備a、b、c、d、e、f、g,設(shè)備a有4種狀態(tài),設(shè)備b有3種狀態(tài),設(shè)備c有8種狀態(tài),設(shè)備d有8種狀態(tài),設(shè)備e有1種狀態(tài),設(shè)備f有4種狀態(tài),設(shè)備g有6種狀態(tài)。如果每一種設(shè)備的狀態(tài)用一個(gè)字節(jié)表示,共需要7個(gè)字節(jié)。實(shí)際上設(shè)備a有4種狀態(tài),用2位表示即可,即使對(duì)于有8種狀態(tài)的設(shè)備c和d,用3位二進(jìn)制表示也就夠了。7種設(shè)備總共用16位二進(jìn)制數(shù),用一個(gè)無(wú)符號(hào)整型變量flag來(lái)表示即可。利用位運(yùn)算可以處理這些標(biāo)志信息,但處理起來(lái)比較麻煩。例如對(duì)于上述系統(tǒng)的設(shè)備狀態(tài),b設(shè)備3種狀態(tài)用flag的第12、13位表示,如果b的狀態(tài)為01,利用位運(yùn)算來(lái)設(shè)置變量flag的方法可以為
(1)將01存入一個(gè)臨時(shí)變量temp;
(2)將temp左移12位,將01移至第12、13位;
(3)將flag和temp進(jìn)行“按位或”運(yùn)算。
同樣,要想使用flag中存放的設(shè)備b的狀態(tài)信息,可能需要進(jìn)行以下操作:
(1)將flag內(nèi)容送至臨時(shí)變量temp;
(2)將temp與0x3000進(jìn)行“按位與”運(yùn)算,屏蔽掉除12、13位的其他位;
(3)temp右移12位。
除了以上方法外,C語(yǔ)言提供了位段操作,可以方便地實(shí)現(xiàn)對(duì)一個(gè)變量的某些位進(jìn)行處理。所謂位段,是以位為單位定義長(zhǎng)度的一種結(jié)構(gòu)類型的成員。上述系統(tǒng)的設(shè)備狀態(tài)可以用位段來(lái)實(shí)現(xiàn)。8.2.1位段結(jié)構(gòu)類型
位段結(jié)構(gòu)是一種構(gòu)造類型,類型定義的方法為8.2.2位段結(jié)構(gòu)類型變量的定義與引用
1.位段結(jié)構(gòu)類型的變量
定義了位段結(jié)構(gòu)類型后,就可以定義相應(yīng)位段結(jié)構(gòu)類型的變量了。位段結(jié)構(gòu)類型變量的定義方法和其他變量定義方法一樣。例如利用上面定義的類型status可以定義變量flag:
structstatusflag;
這些位段的存放位置由編譯系統(tǒng)分配,不同的編譯系統(tǒng)分配方式不同,有的系統(tǒng)從左到右分配,有的系統(tǒng)則從右到左分配。程序設(shè)計(jì)人員不必考慮具體的分配方式,可以直接利用位段名對(duì)位段進(jìn)行操作。
2.位段數(shù)據(jù)的引用
位段數(shù)據(jù)的引用方法和結(jié)構(gòu)體成員的引用方式相同,例如可以為flag的成員a賦值:
flag.a=2;\*a的值為10*\
flag.b=1;\*b的值為01*\
如果所賦的值超過(guò)了位段所允許的最大范圍,系統(tǒng)會(huì)自動(dòng)取數(shù)的低位。例如:
flag.a=5;
由于5的二進(jìn)制形式為101,位段a只有2位,所以結(jié)果a的值為01。圖8.10位段結(jié)構(gòu)中定義無(wú)名位段圖8.11無(wú)名位段長(zhǎng)度為0如果沒有長(zhǎng)度為0的無(wú)名位段,位段f3應(yīng)該和位段f2相鄰存放,由于長(zhǎng)度為0的無(wú)名位段的存在,位段f3被分配到下一個(gè)單元。
(5)一個(gè)位段必須存儲(chǔ)在同一存儲(chǔ)單元,而不能橫跨兩個(gè)存儲(chǔ)單元。如果一個(gè)單元空間不夠,則系統(tǒng)從下一個(gè)單元起存放該位段。例如:由于f1和f2占用了12位,f3需要6位,第一個(gè)單元剩余的4位放不下,于是f3從第二個(gè)單元開始存放,如圖8.12所示。
因?yàn)橐粋€(gè)位段不能橫跨兩個(gè)單元,所以一個(gè)位段的長(zhǎng)度不能超過(guò)一個(gè)存儲(chǔ)單元。
也不能定義位段數(shù)組,并且不能用指針指向位段。圖8.12一個(gè)單元空間不夠時(shí)的存儲(chǔ)格式圖8.13位段結(jié)構(gòu)中包含非位段成員
(7)位段可以在數(shù)值表達(dá)式中引用,并被系統(tǒng)自動(dòng)轉(zhuǎn)換成整型數(shù)。例如:
data5.f1+5;
data4.f2+15/data5.f1;
以上兩個(gè)都是合法的表達(dá)式。請(qǐng)讀者自己分析這兩個(gè)表達(dá)式的值。
位段可以在表達(dá)式中引用,所以位段也可以以整型格式輸出。例如:
printf("%d,%d",data2.f1,data1.f2);
當(dāng)然也可以用%u、%o、%x等格式輸出。8.2.3應(yīng)用舉例
【例8.10】
取一個(gè)整數(shù)a(用16位存儲(chǔ))從右端開始的4~7位。
問(wèn)題分析:例如,0000000011011001(八進(jìn)制331,十進(jìn)制217,4~7位1101的八進(jìn)制值是15,十進(jìn)制值是13)。方法:
①先使a右移4位,使要取出的幾位移到最右端,即a>>4;
②設(shè)置一個(gè)低4位全為1,其余為0的數(shù)~(~0<<4);
③將上面兩者進(jìn)行&運(yùn)算。
程序如下:圖8.14例8.10的運(yùn)行結(jié)果
【例8.11】
從鍵盤上輸入一個(gè)十進(jìn)制整數(shù),統(tǒng)計(jì)該整數(shù)所對(duì)應(yīng)的二進(jìn)制數(shù)中1的個(gè)數(shù)。
問(wèn)題分析:統(tǒng)計(jì)一個(gè)整數(shù)m中1的個(gè)數(shù)有兩種方法。
方法1:
①測(cè)試m的第0位是否為1,是則1的個(gè)數(shù)加1;
②m右移1位;
③循環(huán)執(zhí)行①、②。
程序如下:圖8.15例8.11的運(yùn)行結(jié)果方法2:
①k=
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年工廠股權(quán)轉(zhuǎn)讓與產(chǎn)業(yè)園區(qū)配套設(shè)施建設(shè)合同3篇
- 個(gè)人貸款延期合同書2024版標(biāo)準(zhǔn)格式版B版
- 二零二五年度啤酒節(jié)場(chǎng)地租賃合同(含設(shè)備安裝與維護(hù)服務(wù))3篇
- 2025年度朋友合資經(jīng)營(yíng)兒童游樂(lè)場(chǎng)合同4篇
- 二零二五版綠色建筑項(xiàng)目材料集中采購(gòu)合同3篇
- 二零二五年度內(nèi)墻膩?zhàn)赢a(chǎn)品責(zé)任保險(xiǎn)合同
- 2025年度生態(tài)旅游區(qū)臨設(shè)轉(zhuǎn)讓及生態(tài)保護(hù)合同4篇
- 2025版土地居間業(yè)務(wù)規(guī)范化合同書(正規(guī)范本)6篇
- 二零二五年度啤酒產(chǎn)品節(jié)慶活動(dòng)專用代理合同
- 二零二五年度二手車買賣及二手車評(píng)估合同協(xié)議2篇
- 2023年廣東省公務(wù)員錄用考試《行測(cè)》真題及答案解析
- 2024年公證遺產(chǎn)繼承分配協(xié)議書模板
- 燃?xì)饨?jīng)營(yíng)安全重大隱患判定標(biāo)準(zhǔn)課件
- 深圳小學(xué)英語(yǔ)單詞表(中英文)
- 護(hù)理質(zhì)量反饋內(nèi)容
- 山東省濟(jì)寧市2023年中考數(shù)學(xué)試題(附真題答案)
- 抖音搜索用戶分析報(bào)告
- 鉆孔灌注樁技術(shù)規(guī)范
- 2023-2024學(xué)年北師大版必修二unit 5 humans and nature lesson 3 Race to the pole 教學(xué)設(shè)計(jì)
- 供貨進(jìn)度計(jì)劃
- 彌漫大B細(xì)胞淋巴瘤護(hù)理查房
評(píng)論
0/150
提交評(píng)論