文本關(guān)鍵字:位運(yùn)算符、位邏輯運(yùn)算符、移位運(yùn)算符
為泗縣等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及泗縣網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、泗縣網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
大家在接觸運(yùn)算符的時(shí)候通常都已經(jīng)學(xué)完了變量的使用,對(duì)于算術(shù)以及賦值運(yùn)算的感覺就是So easy!這不就是小學(xué)的知識(shí)嘛,對(duì)于邏輯運(yùn)算符的部分依然無壓力,這不就是中學(xué)的知識(shí)嘛?但是突然出現(xiàn)了一個(gè)位運(yùn)算符,啥是移位?啥是異或?接下來就先從簡(jiǎn)單的開始。
說起位運(yùn)算符,其實(shí)就是基于數(shù)據(jù)存儲(chǔ)的二進(jìn)制位進(jìn)行的運(yùn)算,更底層,所以效率更高。另外一個(gè)需要注意的問題就是:由于小數(shù)在進(jìn)行存儲(chǔ)的時(shí)候采用的是IEEE(符號(hào)、指數(shù)、尾數(shù))方式,并不止對(duì)整數(shù)和小數(shù)部分直接轉(zhuǎn)換為二進(jìn)制來存儲(chǔ)的,所以小數(shù)是不能使用位運(yùn)算符來操作的。對(duì)于整數(shù)和字符型的運(yùn)算符操作也有一些潛在的法則,相信看完這篇文章你很容易就會(huì)掌握。
在邏輯運(yùn)算中我們已經(jīng)使用過能夠表達(dá)邏輯意義的運(yùn)算符,如:&&,||,!。這些運(yùn)算符都有一個(gè)共同點(diǎn),那就是:運(yùn)算符兩邊都是布爾值或布爾表達(dá)式,他們能夠操作的數(shù)據(jù)類型有限,只能夠幫我們進(jìn)行邏輯運(yùn)算。有些教材將&,|等位運(yùn)算符也歸為邏輯運(yùn)算符,因?yàn)榘次慌c(&)、按位或(|)能夠操作的數(shù)據(jù)類型較多,其中就包括布爾類型,并且也能夠幫助我們進(jìn)行邏輯運(yùn)算,但是小編還是建議按照符號(hào)本身的運(yùn)算方式和操作數(shù)據(jù)類型等來記憶。
與運(yùn)算相當(dāng)于物理電路中的串聯(lián)電路,我們假設(shè)用1代表通路,用0代表斷路,那么對(duì)于串聯(lián)電路來說,只有當(dāng)運(yùn)算符兩邊全為1(通路)時(shí),運(yùn)算結(jié)果才為1(通路)。
那么按位與就是將運(yùn)算符兩邊的數(shù)字轉(zhuǎn)換為二進(jìn)制后,在每?jī)蓚€(gè)對(duì)應(yīng)位置上的數(shù)字進(jìn)行與運(yùn)算,再將最后的結(jié)果按十進(jìn)制寫出就可以了。
24 & -30:
00000000 00000000 00000000 00011010 = 26
11111111 11111111 11111111 11100010 = -30
00000000 00000000 00000000 00000010 = 26 & -30 = 2
當(dāng)我們?cè)谑褂眠壿嬇c(&&)時(shí)會(huì)遇到一個(gè)短路問題:當(dāng)用&&把多個(gè)布爾表達(dá)式連接起來的時(shí)候,為了以最快的速度得出結(jié)果,那么有些式子將不會(huì)執(zhí)行,被跳過的式子中的代碼也就不會(huì)被執(zhí)行。比如:(假式 && 真式 && 真式),經(jīng)過前兩個(gè)式子的結(jié)果已經(jīng)能夠確定整個(gè)式子的結(jié)果:為假,第三個(gè)式子無論為真或假都不會(huì)影響最終結(jié)果,這個(gè)時(shí)候就會(huì)進(jìn)行跳過。
但是對(duì)于&(按位與),由于本質(zhì)上是一個(gè)位運(yùn)算,只不過同時(shí)也支持布爾類型的直接運(yùn)算而已,所以不會(huì)出現(xiàn)表達(dá)式不執(zhí)行的情況。
或運(yùn)算相當(dāng)于物理電路中的并聯(lián)電路,我們假設(shè)用1代表通路,用0代表斷路,那么對(duì)于并聯(lián)電路來說,只要運(yùn)算符兩邊有一個(gè)為1(通路)時(shí),運(yùn)算結(jié)果就為1(通路)。
那么按位或就是將運(yùn)算符兩邊的數(shù)字轉(zhuǎn)換為二進(jìn)制后,在每?jī)蓚€(gè)對(duì)應(yīng)位置上的數(shù)字進(jìn)行或運(yùn)算,再將最后的結(jié)果按十進(jìn)制寫出就可以了。
26 | -30:
00000000 00000000 00000000 00011010 = 26
11111111 11111111 11111111 11100010 = -30
11111111 11111111 11111111 11111010 = 26 | -30 = -6
當(dāng)我們?cè)谑褂眠壿嫽颍▅|)時(shí)會(huì)遇到一個(gè)短路問題:當(dāng)用||把多個(gè)布爾表達(dá)式連接起來的時(shí)候,為了以最快的速度得出結(jié)果,那么有些式子將不會(huì)執(zhí)行,被跳過的式子中的代碼也就不會(huì)被執(zhí)行。比如:(真式 || 假式 && 假式),經(jīng)過前兩個(gè)式子的結(jié)果已經(jīng)能夠確定整個(gè)式子的結(jié)果:為真,第三個(gè)式子無論為真或假都不會(huì)影響最終結(jié)果,這個(gè)時(shí)候就會(huì)進(jìn)行跳過。
但是對(duì)于|(按位與),與按位或相同,是一個(gè)位運(yùn)算符,不會(huì)出現(xiàn)跳過的情況。
取反運(yùn)算的規(guī)則相對(duì)簡(jiǎn)單,同樣是在二進(jìn)制位上的運(yùn)算,那么遇到0變?yōu)?,遇到1變?yōu)?。
對(duì)于一個(gè)數(shù)n的取反可以按照公式快讀得出結(jié)果:~n = -n - 1
其實(shí)異或的運(yùn)算規(guī)則很好記,對(duì)對(duì)碰原則,兩個(gè)數(shù)相同為0,不同為1,如下表:
如果我們需要將兩個(gè)數(shù)交換,一般都需要引入第三個(gè)變量,作為中間變量或進(jìn)行運(yùn)算實(shí)現(xiàn)。其實(shí),我們還可以利用異或運(yùn)算的規(guī)律來實(shí)現(xiàn):不借助第三個(gè)變量來實(shí)現(xiàn)兩個(gè)數(shù)的交換。
a = a ^ b;
b = a ^ b; -> 使用交換律:b = (a ^ b) ^ b = (b ^ a) ^ b = a
a = a ^ b; -> 此時(shí)b的值為a,a的值為:(a ^ b) -> a = (a ^ b) ^ a = b
特別注意:雖然異或可以用于兩個(gè)數(shù)的交換,但是由于異或有一個(gè)特別的性質(zhì),即a ^ a = 0,所以當(dāng)兩個(gè)數(shù)相等時(shí),會(huì)導(dǎo)致兩個(gè)數(shù)都變?yōu)?
特別注意:對(duì)于位移運(yùn)算不能直接和除法的結(jié)果等同,在負(fù)數(shù)時(shí)將不相等
將一個(gè)整數(shù)的二進(jìn)制位向左平移指定的位數(shù),由于是左移就相當(dāng)于是擴(kuò)大了數(shù)值,并且每移動(dòng)一位,相當(dāng)于擴(kuò)大了二倍。
由于正數(shù)的高位都是0,負(fù)數(shù)的高位都是1,所以在一定的范圍內(nèi),經(jīng)過向左移位不會(huì)改變數(shù)字的正負(fù)。但如果超出了一定的范圍,將會(huì)改變數(shù)字的正負(fù),并且會(huì)充滿隨機(jī)性,正負(fù)性將取決于最高位(符號(hào)位)的數(shù)值。
-7 << 2 = -28
-7 << 30 = 1073741824
將一個(gè)整數(shù)的二進(jìn)制位向右平移指定的位數(shù),由于是右移就相當(dāng)于是縮小了數(shù)值,并且每移動(dòng)一位,相當(dāng)于縮小了二倍。
由于符號(hào)位在高位的部分,并且在移動(dòng)的過程中的補(bǔ)位也是根據(jù)正負(fù)的規(guī)則在補(bǔ),所以右移不會(huì)改變正負(fù)。
無符號(hào)右移的計(jì)算規(guī)則與右移相同,區(qū)別在于,不會(huì)進(jìn)行正負(fù)的區(qū)分,高位一律用0補(bǔ)位。如果原數(shù)是一個(gè)負(fù)數(shù),則可能直接得到一個(gè)非常大的正數(shù)。