資源描述:
《第12章_位運(yùn)算》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、第十二章位運(yùn)算6/30/20211主要內(nèi)容12.1位運(yùn)算符和位運(yùn)算12.2位運(yùn)算舉例12.3位段6/30/20212概念位運(yùn)算是指按二進(jìn)制位進(jìn)行的運(yùn)算。因?yàn)樵谙到y(tǒng)軟件中,常要處理二進(jìn)制位的問題。例如:將一個(gè)存儲單元中的各二進(jìn)制位左移或右移一位,兩個(gè)數(shù)按位相加等。C語言提供位運(yùn)算的功能,與其他高級語言(如PASCAL)相比,具有很大的優(yōu)越性。6/30/20213§12.1位運(yùn)算符和位運(yùn)算運(yùn)算符含義運(yùn)算符含義&按位與~取反
2、按位或<<左移∧按位異或>>右移(1)位運(yùn)算符中除~以外,均為二目(元)運(yùn)算符,即要求兩側(cè)各有一
3、個(gè)運(yùn)算量。(2)運(yùn)算量只能是整型或字符型的數(shù)據(jù),不能為實(shí)型數(shù)據(jù)。C語言提供的位運(yùn)算符有:說明:6/30/2021412.1.1“按位與”運(yùn)算符(&)按位與是指:參加運(yùn)算的兩個(gè)數(shù)據(jù),按二進(jìn)制位進(jìn)行“與”運(yùn)算。如果兩個(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
4、(1)3&5的值得16/30/20215按位與的用途:若想對一個(gè)存儲單元清零,即使其全部二進(jìn)制位為0,只要找一個(gè)二進(jìn)制數(shù),其中各個(gè)位符合以下條件:原來的數(shù)中為1的位,新數(shù)中相應(yīng)位為0。然后使二者進(jìn)行&運(yùn)算,即可達(dá)到清零目的。(1)清零例:原有數(shù)為00101011,另找一個(gè)數(shù),設(shè)它為10010100,這樣在原數(shù)為1的位置上,該數(shù)的相應(yīng)位值均為0。將這兩個(gè)數(shù)進(jìn)行&運(yùn)算:00101011&10010100000000006/30/20216(2)取一個(gè)數(shù)中某些指定位如有一個(gè)整數(shù)a(2個(gè)字節(jié)),想要取其中的低字節(jié),只需將a
5、與8個(gè)1按位與即可。0010110010101100abc000000001111111100000000101011006/30/20217(3)保留一位的方法:與一個(gè)數(shù)進(jìn)行&運(yùn)算,此數(shù)在該位?。薄<矗篴=84,b=59c=a&b=16例:有一數(shù)01010100,想把其中左面第3、4、5、7、8位保留下來,運(yùn)算如下:01010100(84)&00111011(59)00010000(16)6/30/2021812.1.2“按位或”運(yùn)算符(
6、)兩個(gè)相應(yīng)的二進(jìn)制位中只要有一個(gè)為1,該位的結(jié)果值為1。即0
7、0=0,0
8、
9、1=1,1
10、0=1,1
11、1=1例:060
12、017,將八進(jìn)制數(shù)60與八進(jìn)制數(shù)17進(jìn)行按位或運(yùn)算。00110000
13、00001111001111116/30/20219應(yīng)用:按位或運(yùn)算常用來對一個(gè)數(shù)據(jù)的某些位定值為1。例如:如果想使一個(gè)數(shù)a的低4位改為1,只需將a與017進(jìn)行按位或運(yùn)算即可。例:a是一個(gè)整數(shù)(16位),有表達(dá)式:a
14、0377則低8位全置為1,高8位保留原樣。6/30/20211012.1.3“異或”運(yùn)算符(∧)異或運(yùn)算符∧也稱XOR運(yùn)算符。它的規(guī)則是:若參加運(yùn)算的兩個(gè)二進(jìn)制位同號則結(jié)果為0(假)異號
15、則結(jié)果為1(真)即:0∧0=0,0∧1=1,1∧0=1,1∧1=0即:071∧052=023(八進(jìn)制數(shù))00111001∧0010101000010011例:6/30/202111(1)使特定位翻轉(zhuǎn)設(shè)有01111010,想使其低4位翻轉(zhuǎn),即1變?yōu)椋埃白優(yōu)椋???梢詫⑺c00001111進(jìn)行∧運(yùn)算,即:∧運(yùn)算符應(yīng)用:01111010∧0000111101110101運(yùn)算結(jié)果的低4位正好是原數(shù)低4位的翻轉(zhuǎn)??梢?,要使哪幾位翻轉(zhuǎn)就將與其進(jìn)行∧運(yùn)算的該幾位置為1即可。6/30/202112因?yàn)樵瓟?shù)中的1與0進(jìn)行∧運(yùn)算得1,
16、0∧0得0,故保留原數(shù)。例如:012∧00=012(2)與0相∧,保留原值00001010∧00000000000010106/30/202113(3)交換兩個(gè)值,不用臨時(shí)變量例如:a=3,b=4。想將a和b的值互換,可以用以下賦值語句實(shí)現(xiàn):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)6/30/202114①執(zhí)行前兩個(gè)賦值語句:“a=a∧b;”和“b=b
17、∧a;”相當(dāng)于b=b∧(a∧b)。②再執(zhí)行第三個(gè)賦值語句:a=a∧b。由于a的值等于(a∧b),b的值等于(b∧a∧b),因此,相當(dāng)于a=a∧b∧b∧a∧b,即a的值等于a∧a∧b∧b∧b,等于b。a得到b原來的值。即等效于以下兩步:6/30/20211512.1.4“取反”運(yùn)算符(~)~是一個(gè)單目(元)運(yùn)算符,用來對一個(gè)二進(jìn)制數(shù)按位取反,即將0變1,將1變