版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第C語言各種符號的使用介紹下篇目錄1、按位運(yùn)算符1.1按位或(|)和按位與()1.2按位異或(^)1.3一個關(guān)于整型提升的問題2、移位操作符2.1左移右移操作符2.2習(xí)題練習(xí)3、++和--的操作3.1基本操作3.2從匯編角度深入理解a++
1、按位運(yùn)算符
1.1按位或(|)和按位與()
上期我們講到過邏輯或和邏輯與,他們得到的結(jié)果是真假值,但我們一定要區(qū)分清楚,按位運(yùn)算符|和與邏輯運(yùn)算符||是完全兩個概念。
按位,簡明之意,按數(shù)值二進(jìn)制位來進(jìn)行運(yùn)算,都是在數(shù)據(jù)補(bǔ)碼的基礎(chǔ)上進(jìn)行。
按位或|:兩個數(shù)值的二進(jìn)制補(bǔ)碼對應(yīng)位進(jìn)行運(yùn)算,對應(yīng)位有1則為1,否則為0。
按位與:兩個數(shù)值的二進(jìn)制補(bǔ)碼對應(yīng)位進(jìn)行運(yùn)算,對應(yīng)位都為1則為1,否則為0。
這里我們舉例說明:
1|2:
1的二進(jìn)制補(bǔ)碼:00000000...00000001
2的二進(jìn)制補(bǔ)碼:00000000...00000010
------按位或結(jié)果:00000000...00000011-對應(yīng)十進(jìn)制:3
12:
1的二進(jìn)制補(bǔ)碼:00000000...00000001
2的二進(jìn)制補(bǔ)碼:00000000...00000010
------按位與結(jié)果:00000000...00000000-對應(yīng)十進(jìn)制:0
其實(shí)有很多大學(xué)老師或者是書上都有可能把按位或,按位與,以及后面我們要講的按位異或,他們會把每位二進(jìn)制運(yùn)算后的結(jié)果稱為真或者假,其實(shí)這樣的說法是不夠嚴(yán)謹(jǐn)?shù)模婕偈沁壿嬇袛?,而按位運(yùn)算得到的結(jié)果是數(shù)值,而且在C語言中0表示假,非0為真,所以我是不推薦這種說法。
1.2按位異或(^)
按位或^:兩個數(shù)值的二進(jìn)制補(bǔ)碼對應(yīng)位進(jìn)行運(yùn)算,相同為0,不同為1。
這里我們舉例說明:
1^3:
1的二進(jìn)制補(bǔ)碼:00000000...00000001
3的二進(jìn)制補(bǔ)碼:00000000...00000011
---按位異或結(jié)果:00000000...00000010-對應(yīng)十進(jìn)制:2
5^0:
5的二進(jìn)制補(bǔ)碼:00000000...00000101
0的二進(jìn)制補(bǔ)碼:00000000...00000000
---按位異或結(jié)果:00000000...00000101-對應(yīng)十進(jìn)制:5
結(jié)論:任何數(shù)異或0都等于它本身
這里有一道筆試題:不創(chuàng)建臨時變量,實(shí)現(xiàn)兩個數(shù)的交換。
//很多小伙伴直接想出來的做法:
intmain()
inta=10;
intb=20;
printf("a=%d,b=%d\n",a,b);
a=a+b;
b=a-b;
a=a-b;
printf("a=%d,b=%d\n",a,b);
return0;
}
但是我們仔細(xì)研究下這段代碼,他有沒有什么隱藏的問題呢?
一個整型,占四個字節(jié),也就是32個比特位,這里進(jìn)行加法運(yùn)算,就會產(chǎn)生進(jìn)位,萬一我們是兩個很大的數(shù)相加呢?他們的和超過了整型最大存儲范圍,那么在計(jì)算機(jī)里面就會發(fā)生截?cái)?!為了避免發(fā)生這種現(xiàn)象,我們可以采取異或的方法來實(shí)現(xiàn)這道題:
最后還有一個很簡單的按位取反操作符:~
用途:對一個數(shù)的二進(jìn)制按位取反(包括它的符號位)
注意:以上的位運(yùn)算符,他們的操作數(shù)必須是整數(shù)!
1.3一個關(guān)于整型提升的問題
有這樣一串代碼,問:為什么一個char類型大小可以求出來是4字節(jié)?
無論任何位運(yùn)算符,都是要計(jì)算機(jī)進(jìn)行計(jì)算的,而計(jì)算機(jī)中CPU具有運(yùn)算能力,但計(jì)算的數(shù)據(jù)都是放在內(nèi)存中的。所以,做任何運(yùn)算,都必須將數(shù)據(jù)從內(nèi)存拿到CPU的寄存器中。而寄存器默認(rèn)的操作數(shù)寬度是32位,可是,char類型數(shù)據(jù)只有1個字節(jié),也就是8位,不滿足32位怎么辦,這就需要整型提升了?。ㄔ敿?xì)整型提升大家可以查閱資料哦)
如果是一個有符號數(shù)的話:高位補(bǔ)符號位
如果是一個無符號數(shù)的話:高位補(bǔ)0
2、移位操作符
2.1左移右移操作符
左移運(yùn)算符是一個雙目運(yùn)算符,功能是把左邊的運(yùn)算數(shù)的各個二進(jìn)制位向左移動指定位數(shù)。
右移運(yùn)算符是一個雙目運(yùn)算符,功能是把右邊的運(yùn)算數(shù)的各個二進(jìn)制位向右移動指定位數(shù)。
注意:
左移:最低位丟棄,最高位補(bǔ)零
右移:
無符號數(shù):最低位丟棄,最高位補(bǔ)零[邏輯右移]有符號數(shù):最低位丟棄,最高位補(bǔ)符號位[算數(shù)右移]
以上在補(bǔ)碼中進(jìn)行運(yùn)算
警告:移位運(yùn)算符,請不要移動負(fù)數(shù)位,這是標(biāo)準(zhǔn)未定義的!
左移我們好說,主要是右移我們需要細(xì)講一下:
明顯看到,這是在無符號數(shù)下進(jìn)行右移,第一個小伙伴都不會感到驚訝,可是第二個就有點(diǎn)不理解了,我們來解釋下:
這里有一個問題,當(dāng)-1準(zhǔn)備放入變量b的時候我們需要看-1的類型嗎?
答案是不需要!內(nèi)存中放的都是二進(jìn)制補(bǔ)碼,本質(zhì)上是把-1的補(bǔ)碼放入變量b當(dāng)中,第二,右移操作符屬于計(jì)算,需要在CPU中進(jìn)行,所以需要先把內(nèi)存中-1的補(bǔ)碼拿到CPU寄存器中運(yùn)算,按照我們的規(guī)則,右移中,無符號數(shù)低位丟棄高位補(bǔ)零,所以-1右移完成之后就變成了01111111...11111111,接著我們以%d有符號整型打印,就會把他當(dāng)作有符號數(shù)看待,最高位是0所以被認(rèn)為是正數(shù),轉(zhuǎn)化成十進(jìn)制也就是如上打印的值。
第二個我們來看下有符號數(shù)右移:
這個相信大家就很好理解了,第一個高位補(bǔ)符號位也就是補(bǔ)0,低位丟棄,所以結(jié)果是0,第二個高位補(bǔ)符號位也就是補(bǔ)1,低位丟棄,值仍然不變,還是-1。
注意:a1并不會改變a變量的值,就好比如a+1。這樣寫才會改變:a=a1;
2.2習(xí)題練習(xí)
學(xué)完了上期的邏輯操作符,和本期的移位操作符,我們來練練手:
請你設(shè)計(jì)一個宏可以指定數(shù)據(jù)第幾個比特位更改為1,并設(shè)計(jì)一個函數(shù)將各個比特位打印出來。
//參考
#defineSETBIT(a,num)((a)|=(1(num-1)))
voidPrintBit(inta)
intnum=31;
while(num=0)
if((a(1num)))
printf("1");
else
printf("0");
--num;
printf("\n");
intmain()
inta=0;
SETBIT(a,5);
PrintBit(a);
return0;
}
3、++和--的操作
3.1基本操作
其實(shí)這節(jié)知識點(diǎn)理解起來是很簡單的,只不過總有些學(xué)校喜歡出一些很拉跨的題目:
inti=3;問:(++i)+(++i)+(++i)的值是多少?
我的建議是,看到這類題,直接空著,你也可以在下面添一句,你禮貌嗎?
這種表達(dá)式,在任何編譯器下算出來的結(jié)果是不一樣的!
對于這種問題沒必要去爭論誰對誰錯,如果有人想跟你杠的話,那么你直接告訴他,你真的超級高水平。
好了,言歸正傳,我們來說一下++和--的基本理解:
前置++--:先自增(減),再使用后置++--:先使用,再自增(減)如果沒有變量接收,那么直接自增。
例子:
基本使用就是這么多,接下來我們從匯編角度來深度理解一下:
3.2從匯編角度深入理解a++
既然我們知道,后置++是先使用后++,如果我們單純的就++一下呢,他這個值被使用到了哪里去了呢?
intmain()
inta=0xDD;
intb=a++;//有b接收,那么a的先使用是將a的值(
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年射擊裁判二級試題及標(biāo)準(zhǔn)答案
- 2026年成人高考食品科學(xué)與工程基礎(chǔ)試題含答案
- 2026年期貨從業(yè)資格基礎(chǔ)考核題庫含答案
- 2026年武漢鐵路橋梁職業(yè)學(xué)院單招綜合素質(zhì)考試參考題庫帶答案解析
- 2026年鄭州軌道工程職業(yè)學(xué)院單招綜合素質(zhì)筆試備考題庫帶答案解析
- 2026年重慶三峽醫(yī)藥高等??茖W(xué)校單招綜合素質(zhì)考試模擬試題帶答案解析
- 2025年肺結(jié)核診斷試題及答案
- 企業(yè)社會責(zé)任與倫理管理指南
- 2025年企業(yè)人力資源管理師三級專業(yè)能力真題及答案
- 2025年青少年“學(xué)憲法、講憲法”知識競賽題庫及答案
- 抽水蓄能行業(yè)發(fā)展前景及投資風(fēng)險預(yù)測分析報(bào)告
- “感恩父母擁抱親情”高一年級主題班會-課件
- 非甾體抗炎藥的臨床應(yīng)用指南
- 超聲內(nèi)鏡穿刺的護(hù)理配合
- 網(wǎng)絡(luò)空間測繪與安全可視化技術(shù)
- 2022年中國工藝美術(shù)館招聘考試真題
- 輔導(dǎo)員工作的職責(zé)與使命課件
- 防造假管理程序文件
- ktv股東合作協(xié)議書
- 2023年北京海淀區(qū)高三一?;瘜W(xué)試題及答案
- 腫瘤內(nèi)科靜脈給予抗腫瘤藥物評價標(biāo)準(zhǔn)
評論
0/150
提交評論