首頁 > 軟體

小敏學Python基礎篇丨負數位運算的講解

2021-05-21 23:00:39

上一篇,我們一起學習了正數的位運算知識,本篇我們繼續學習負數的位運算。

為了方便計算,假定使用8位機器數。這裡我們先定義兩個變數儲存負數,並求得它們的原碼、反碼和補碼,下文演示就直接使用變數:

定義變數a = -5,b = -7a的二進位制原碼:1000 0101,二進位制反碼為:1111 1010,二進位制補碼為:1111 1011b的二進位制原碼:1000 0111,二進位制反碼為:1111 1000,二進位制補碼為:1111 1001

01負數的按位與運算

按位與運算,「與」理解為「並且」的意思,即對應數位的兩個數,第一個是1並且第二個也是1,結果才是1。求a&b的值?

我們先拿1111 1011與1111 1001 的首位比較,第一個數為1,並且第二個數也為1,那麼結果記作1;然後再往右比較第二位,就這樣依次比較完所有位,最後得到結果為:1111 1001。

注意這個結果是補碼形式,需要轉化為原碼,再轉化為十進位制數。而求補碼的原碼,只需要對補碼再求一次補碼就可以了。

1111 1001的反碼為1000 0110,補碼為1000 0111,轉化為十進位制數為-7,也就是說a&b的結果是-7。黑視窗演示python運行結果如下:

負數的按位與運算演示

02負數的按位或運算

按位或運算,「或」理解為「或者」的意思,即對應數位的兩個數第一個是1,或者第二個是1,則結果是1。求a|b的值?

我們先拿1111 1011與1111 1001 的首位比較,第一個數為1,或者第二個數為1,那麼結果記作1;然後再往右比較第二位,就這樣依次比較完所有位,最後得到結果為:1111 1011。

同樣地,需要求1111 1011的補碼。先求反碼為1000 0100,補碼為1000 0101,轉化為十進位制數為-5,也就是說a|b的結果是-5。黑視窗演示python運行結果如下:

負數的按位或運算演示

03負數的按位異或運算

按位異或運算,「異」理解為「不同」的意思,即對應數位的兩個數不相等則結果為1。求a^b的值?

我們先拿1111 1011與1111 1001 的首位比較,第一個數為1,第二個數為1,兩數相同,記作0;然後再往右比較第二位,就這樣依次比較完所有位,最後得到結果為:0000 0010。

同樣地,需要求0000 0010的補碼。而二進位制數的最高位是符號位,0代表正數,1代表負數,而正數的原碼和反碼和補碼相等,所以它的補碼也是0000 0010,轉化為十進位制數就是2,也就是說a^b的結果是2。黑視窗演示python運行結果如下:

負數按位異或演示

04負數的按位取反運算

按位取反運算,「」理解為「相反」的意思,即二進位制的所有數位1變為0,0變為1。求~a的值?

我們拿1111 1011取反得到0000 0100,同樣地這個數也是補碼,由於是正數,所以原碼也是它,轉化為十進位制數是4,即~a的結果是4。黑視窗演示python運行結果如下:

負數按位取反運算演示

好了,本期關於負數的位運算符的學習就結束了,各位友友學會了麼?歡迎大家在評論區留言討論交流。我是程式媛小敏,持續為您分享python知識乾貨。


IT145.com E-mail:sddin#qq.com