- Python快速編程入門
- 黑馬程序員編著
- 1353字
- 2019-07-30 13:07:10
2.6 位運(yùn)算
程序中所有的數(shù)在計(jì)算機(jī)內(nèi)存中都是以二進(jìn)制的形式存儲(chǔ)的。位運(yùn)算其實(shí)就是直接對(duì)整數(shù)在內(nèi)存中的二進(jìn)制位進(jìn)行操作,例如,6對(duì)應(yīng)的二進(jìn)制數(shù)是110,11對(duì)應(yīng)的二進(jìn)制數(shù)是1011,那么,6 & 11的結(jié)果是2,這是二進(jìn)制對(duì)應(yīng)位進(jìn)行邏輯與運(yùn)行的結(jié)果。Python中的位運(yùn)算主要包括下列幾種:
(1)<< 按位左移
(2)>> 按位右移
(3)& 按位與
(4)| 按位或
(5)^ 按位異或
(6)~ 按位取反
接下來(lái),本節(jié)將針對(duì)這幾種位運(yùn)算進(jìn)行詳細(xì)講解。
2.6.1 按位左移
按位左移指的是二進(jìn)制位全部左移n位,高位丟棄,低位補(bǔ)0。符號(hào)“<<”是按位左移的符號(hào),例如,x << n表示x的所有二進(jìn)制位向左移動(dòng)n 位,移出位刪掉,移進(jìn)的位補(bǔ)零。以十進(jìn)制的9為例,它轉(zhuǎn)換為二進(jìn)制數(shù)是00001001,將9左移4位,其結(jié)果如圖2-13所示。

圖2-13 按位左移
從圖2-13中可以看出,二進(jìn)制數(shù)0000 1001左移4位后的結(jié)果為10010000。為了驗(yàn)證上述結(jié)果是否正確,我們通過(guò)代碼來(lái)驗(yàn)證一下,具體如下:
>>> a=9
>>> bin(a<<4) // 將9左移4位
'0b10010000'
值得一提的是,左移n位相當(dāng)于乘以2的n次方,如果我們希望快速計(jì)算一個(gè)數(shù)乘以2的n次方,可以借助按位左移實(shí)現(xiàn)。
2.6.2 按位右移
按位右移指的是將二進(jìn)制位全部右移n位,移出的位丟棄,移進(jìn)的位補(bǔ)符號(hào)位。按位右移的符號(hào)位保持不變。符號(hào)“>>”是按位右移的符號(hào),以十進(jìn)制的8為例,它轉(zhuǎn)換為二進(jìn)制數(shù)是00001000,將8右移2位,其結(jié)果如圖2-14所示。

圖2-14 按位右移
從圖2-14中可以看出,當(dāng)將00001000右移2位后,結(jié)果為00000010。為了驗(yàn)證結(jié)果是否正確,接下來(lái),在代碼中進(jìn)行測(cè)試,具體如下:
>>> a=8
>>> bin(a>>2) // 將8右移2位后的結(jié)果轉(zhuǎn)換為二進(jìn)制
'0b10'
從結(jié)果可以看出,8右移2位后,相當(dāng)于除以4,結(jié)果為2。
需要注意的是,按位右移n位相當(dāng)于除以2的n次方,如果我們想快速計(jì)算一個(gè)數(shù)除以2的n次方,可以借助按位右移實(shí)現(xiàn)。
2.6.3 按位與
按位與指的是參與運(yùn)算的兩個(gè)數(shù)各對(duì)應(yīng)的二進(jìn)制位進(jìn)行“與”的操作。只有對(duì)應(yīng)的兩個(gè)二進(jìn)制位都是1時(shí),結(jié)果位就為1,否則結(jié)果位為0。符號(hào)“&”是按位與的符號(hào),接下來(lái),以9和3為例,進(jìn)行按位與操作,如圖2-15所示。
從圖2-15中可以看出,當(dāng)將00001001與00000011進(jìn)行按位與操作后,結(jié)果為00000001。為了驗(yàn)證結(jié)果是否正確,接下來(lái),在代碼中進(jìn)行測(cè)試,具體如下:
>>> a=9
>>> b=3
>>> bin(a&b)
'0b1'
從結(jié)果可以看出,9和3進(jìn)行按位與操作后,結(jié)果為十進(jìn)制的1。
2.6.4 按位或
按位或指的是參與運(yùn)算的兩個(gè)數(shù)各對(duì)應(yīng)的二進(jìn)制位進(jìn)行“或”的操作。只要對(duì)應(yīng)的兩個(gè)二進(jìn)制位有一個(gè)為1時(shí),結(jié)果位就為1。當(dāng)參與運(yùn)算的是負(fù)數(shù)時(shí),參與運(yùn)算的兩個(gè)數(shù)均以補(bǔ)碼出現(xiàn)。按位或使用符號(hào)“|”表示,接下來(lái),對(duì)8和3進(jìn)行按位或操作,如圖2-16所示。

圖2-15 按位與操作

圖2-16 按位或
從圖2-16中可以看出,當(dāng)將00001000與00000011進(jìn)行按位或操作后,結(jié)果為00001011。為了驗(yàn)證結(jié)果是否正確,接下來(lái),在代碼中進(jìn)行測(cè)試,具體如下:
>>> a=8
>>> b=3
>>> bin(a|b)
'0b1011'
從結(jié)果可以看出,8和3進(jìn)行按位與操作后,結(jié)果為十進(jìn)制的11。
2.6.5 按位異或
按位異或就是將參與運(yùn)算的兩個(gè)數(shù)對(duì)應(yīng)的二進(jìn)制位進(jìn)行比較,如果一個(gè)位為1,另一個(gè)位為0,則結(jié)果為1,否則,結(jié)果位為0。按位異或使用“^”符號(hào)來(lái)表示,接下來(lái),將8和4進(jìn)行按位異或操作,如圖2-17所示。
從圖2-17中可以看出,當(dāng)將00001000與00000100進(jìn)行按位異或操作后,結(jié)果為00001100。為了驗(yàn)證結(jié)果是否正確,接下來(lái),在代碼中進(jìn)行測(cè)試,具體如下:
>>> a=8
>>> b=4
>>> bin(a^b)
'0b1100'
2.6.6 按位取反
按位取反就是將二進(jìn)制位的每一位進(jìn)行取反,0取反為1,1取反為0。例如,將9按位取反后的結(jié)果為?10,接下來(lái),帶大家一起分析一下9按位取反后為什么結(jié)果為?10,具體如下:
(1)將9轉(zhuǎn)換為二進(jìn)制,變成00001001。因?yàn)檎龜?shù)的原碼=反碼=補(bǔ)碼,真正存儲(chǔ)的時(shí)候,存儲(chǔ)的就是00001001;
(2)對(duì)9的補(bǔ)碼00001001進(jìn)行取反操作,取反后結(jié)果為11110110,這是補(bǔ)碼;
(3)將補(bǔ)碼轉(zhuǎn)為原碼。轉(zhuǎn)換的時(shí)候,符號(hào)位不變,其他位取反,然后+1 得到原碼,結(jié)果為10001010,即?10。
具體過(guò)程如圖2-18所示。

圖2-17 按位異或

圖2-18 按位取反
從圖2-18中可以看出,當(dāng)將00001001按位取反后,結(jié)果為10001010。為了驗(yàn)證結(jié)果是否正確,接下來(lái),在代碼中進(jìn)行測(cè)試,具體如下:
>>> a=9
>>> ~a
-10
>>> bin(~a)
'-0b1010'
從上述代碼可以看出,9按位取反后,結(jié)果為?10,而?10轉(zhuǎn)換為二進(jìn)制數(shù)就是10001010。
- Data Visualization with D3 4.x Cookbook(Second Edition)
- Microsoft Exchange Server PowerShell Cookbook(Third Edition)
- Python測(cè)試開發(fā)入門與實(shí)踐
- jQuery從入門到精通 (軟件開發(fā)視頻大講堂)
- Python完全自學(xué)教程
- 小程序開發(fā)原理與實(shí)戰(zhàn)
- Elasticsearch for Hadoop
- 零基礎(chǔ)輕松學(xué)SQL Server 2016
- Java:High-Performance Apps with Java 9
- JavaCAPS基礎(chǔ)、應(yīng)用與案例
- 大數(shù)據(jù)分析與應(yīng)用實(shí)戰(zhàn):統(tǒng)計(jì)機(jī)器學(xué)習(xí)之?dāng)?shù)據(jù)導(dǎo)向編程
- Getting Started with React Native
- CoffeeScript Application Development Cookbook
- Orleans:構(gòu)建高性能分布式Actor服務(wù)
- 算法設(shè)計(jì)與分析:基于C++編程語(yǔ)言的描述