您現在的位置:首頁 > 綜合 > 特別關注 > 正文

環球快播:Python中如何實現真正的按位取反運算

時間:2023-05-25 14:03:17    來源:腳本之家    
目錄
運算代碼實例說明補充:Python的按位取反運算符的簡單解析總結

文章面向對象:對原理和編程不大有興趣,只是需要用python實現一些運算功能的非計算機學生或從業者。大佬慎看防止血壓拉高

運算代碼

x=~x&0xFF


(資料圖片僅供參考)

num是一個不大于255的十進制正數(負數的我不需要,所以我也沒研究)

計算結果也是十進制的數

&右邊的0xFF會決定計算結果的比特位。如果要得到正確的計算結果,兩邊的數據比特位應該相同

例如1000對應的十六進制是0xFC17,16比特位的,這時候求反就應該改成

x=~x&0xFFFF

實例說明

例如求58的反:

當x大于255時,想要得到正確的數字,就要修改一下代碼

把0xFF換成0xFFFF或者更高,取決于x這個數占用的比特位。

(C語言基礎會講的知識,數據精度問題)

總之就是&兩邊的比特位要對應

**如果&右邊保持為0xFF,但x大于了255,得到的結果則只有低位(如下圖)
**

而實際上1000取反應該得到的十六進制表示是 ‘0xFC 17’

把完整的16比特位的FC17截斷剩下17

(之所以這里用十六進制表示,是因為&右邊對應的是16進制,這樣看會更清楚。實際上取反運算是根據二進制表示運行的,那些也不重要,反正知道可以這樣算就OK啦!)

補充:Python的按位取反運算符的簡單解析

Python的按位取反運算符~的解釋是:

對數據的每個二進制位取反,即把1變為0,把0變為1。~x 類似于 -x-1。

如a =61= 0b0011 1101,按位取反后的結果是:0b1100 0010=194,

可是Python中運算結果并非如此,

輸出的~a的結果是:~a=62

這是怎么回事呢?

計算機中的符號數有三種表示方法,即原碼、反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示“正”,用1表示“負”,而數值位,三種表示方法各不相同。

在計算機系統中,數值一律用補碼來表示和存儲。原因在于,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。

另外,求負整數的補碼,將其對應正數二進制原碼表示所有位取反(包括符號位,0變1,1變0)后加1

這里用括號來表示符號位,0表示正數,1表示負數。

a=61=(0)0b0011 1101,正數補碼

~a=(1)0b1100 0010,負數補碼,符號位為1表示這個代表一個負數,我們要知道其表示的數值。

對應負數原碼到補碼的轉換過程:

(1)數值部分先減一:0b1100 0001

(2)數值部分取反:0b0011 1110,數值部分62

加上符號則~a =-62= (1)0b0011 1110,負數原碼

總結

到此這篇關于Python中如何實現真正的按位取反運算的文章就介紹到這了,更多相關Python按位取反運算內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

關鍵詞:

凡本網注明“XXX(非中國微山網)提供”的作品,均轉載自其它媒體,轉載目的在于傳遞更多信息,并不代表本網贊同其觀點和其真實性負責。

特別關注