Python中如何實(shí)現(xiàn)真正的按位取反運(yùn)算
文章面向?qū)ο螅簩?duì)原理和編程不大有興趣,只是需要用python實(shí)現(xiàn)一些運(yùn)算功能的非計(jì)算機(jī)學(xué)生或從業(yè)者。大佬慎看防止血壓拉高
運(yùn)算代碼
x=~x&0xFF
num是一個(gè)不大于255的十進(jìn)制正數(shù)(負(fù)數(shù)的我不需要,所以我也沒(méi)研究)
計(jì)算結(jié)果也是十進(jìn)制的數(shù)
&右邊的0xFF會(huì)決定計(jì)算結(jié)果的比特位。如果要得到正確的計(jì)算結(jié)果,兩邊的數(shù)據(jù)比特位應(yīng)該相同
例如1000對(duì)應(yīng)的十六進(jìn)制是0xFC17,16比特位的,這時(shí)候求反就應(yīng)該改成
x=~x&0xFFFF
實(shí)例說(shuō)明
例如求58的反:

當(dāng)x大于255時(shí),想要得到正確的數(shù)字,就要修改一下代碼
把0xFF換成0xFFFF或者更高,取決于x這個(gè)數(shù)占用的比特位。
(C語(yǔ)言基礎(chǔ)會(huì)講的知識(shí),數(shù)據(jù)精度問(wèn)題)
總之就是&兩邊的比特位要對(duì)應(yīng)
**如果&右邊保持為0xFF,但x大于了255,得到的結(jié)果則只有低位(如下圖)
**

而實(shí)際上1000取反應(yīng)該得到的十六進(jìn)制表示是 ‘0xFC 17’
把完整的16比特位的FC17截?cái)嗍O?7
(之所以這里用十六進(jìn)制表示,是因?yàn)?amp;右邊對(duì)應(yīng)的是16進(jìn)制,這樣看會(huì)更清楚。實(shí)際上取反運(yùn)算是根據(jù)二進(jìn)制表示運(yùn)行的,那些也不重要,反正知道可以這樣算就OK啦?。?/p>
補(bǔ)充:Python的按位取反運(yùn)算符的簡(jiǎn)單解析
Python的按位取反運(yùn)算符~的解釋是:
對(duì)數(shù)據(jù)的每個(gè)二進(jìn)制位取反,即把1變?yōu)?,把0變?yōu)?。~x 類(lèi)似于 -x-1。
如a =61= 0b0011 1101,按位取反后的結(jié)果是:0b1100 0010=194,
可是Python中運(yùn)算結(jié)果并非如此,
輸出的~a的結(jié)果是:~a=62
這是怎么回事呢?
計(jì)算機(jī)中的符號(hào)數(shù)有三種表示方法,即原碼、反碼和補(bǔ)碼。三種表示方法均有符號(hào)位和數(shù)值位兩部分,符號(hào)位都是用0表示“正”,用1表示“負(fù)”,而數(shù)值位,三種表示方法各不相同。
在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來(lái)表示和存儲(chǔ)。原因在于,使用補(bǔ)碼,可以將符號(hào)位和數(shù)值域統(tǒng)一處理;同時(shí),加法和減法也可以統(tǒng)一處理。
另外,求負(fù)整數(shù)的補(bǔ)碼,將其對(duì)應(yīng)正數(shù)二進(jìn)制原碼表示所有位取反(包括符號(hào)位,0變1,1變0)后加1
這里用括號(hào)來(lái)表示符號(hào)位,0表示正數(shù),1表示負(fù)數(shù)。
a=61=(0)0b0011 1101,正數(shù)補(bǔ)碼
~a=(1)0b1100 0010,負(fù)數(shù)補(bǔ)碼,符號(hào)位為1表示這個(gè)代表一個(gè)負(fù)數(shù),我們要知道其表示的數(shù)值。
對(duì)應(yīng)負(fù)數(shù)原碼到補(bǔ)碼的轉(zhuǎn)換過(guò)程:
(1)數(shù)值部分先減一:0b1100 0001
(2)數(shù)值部分取反:0b0011 1110,數(shù)值部分62
加上符號(hào)則~a =-62= (1)0b0011 1110,負(fù)數(shù)原碼
總結(jié)
到此這篇關(guān)于Python中如何實(shí)現(xiàn)真正的按位取反運(yùn)算的文章就介紹到這了,更多相關(guān)Python按位取反運(yùn)算內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中使用defaultdict和Counter的方法
本文深入探討了Python中的兩個(gè)強(qiáng)大工具——defaultdict和Counter,并詳細(xì)介紹了它們的工作原理、應(yīng)用場(chǎng)景以及在實(shí)際編程中的高效使用方法,感興趣的朋友跟隨小編一起看看吧2025-01-01
Python 工具類(lèi)實(shí)現(xiàn)大文件斷點(diǎn)續(xù)傳功能詳解
用python進(jìn)行大文件下載的時(shí)候,一旦出現(xiàn)網(wǎng)絡(luò)波動(dòng)問(wèn)題,導(dǎo)致文件下載到一半。如果將下載不完全的文件刪掉,那么又需要從頭開(kāi)始,如果連續(xù)網(wǎng)絡(luò)波動(dòng),是不是要頭禿了。本文提供斷點(diǎn)續(xù)傳下載工具方法,希望可以幫助到你2021-10-10
python學(xué)生信息管理系統(tǒng)實(shí)現(xiàn)代碼
這篇文章主要介紹了python學(xué)生信息管理系統(tǒng)的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單,復(fù)制即可使用,需要的朋友可以參考下2019-12-12
Python中循環(huán)后使用list.append()數(shù)據(jù)被覆蓋問(wèn)題的解決
這篇文章主要給大家介紹了關(guān)于Python中循環(huán)后使用list.append()數(shù)據(jù)被覆蓋問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
詳解python異步編程之a(chǎn)syncio(百萬(wàn)并發(fā))
這篇文章主要介紹了詳解python異步編程之a(chǎn)syncio(百萬(wàn)并發(fā)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
跟老齊學(xué)Python之大話(huà)題小函數(shù)(2)
上篇文章我們講訴了map 和lambda函數(shù)的使用,本文我們繼續(xù)來(lái)看看reduce和filter函數(shù),有需要的朋友可以參考下2014-10-10

