Python 和 c++/c/java 對於負數的儲存方式對比
Python 中的整型是補碼形式儲存的
Python 中 bin 一個負數(十進位制表示),輸出的是它的原碼的二進位制表示加上個負號,方便檢視 Python 中 bin 一個負數(十六進位制表示),輸出的是對應的二進位制表示。 |
1、在 python 裡面,負數的儲存方式
例項
a = bin(-3) print(a) a = bin(3) print(a) b = bin(-3 & 0xffffffff) print(b) c = bin(0xfffffffd) print(c) //輸出 //-0b11 //0b11 //0b11111111111111111111111111111101 //0b11111111111111111111111111111101
也就是說:
- Python 中的整型是補碼形式儲存的
- Python 中 bin 一個負數(十進位制表示),輸出的是它的原碼的二進位制表示加上個負號,方便檢視
- Python 中 bin 一個負數(十六進位制表示),輸出的是對應的二進位制表示。
所以你為了獲得負數(十進位制表示)的補碼,需要手動將其和十六進位制數 0xfffffffd 進行按位與操作,得到結果也是個十六進位制數,再交給 bin() 進行輸出,得到的才是你想要的補碼錶示。
2、但是在c/c++/java裡面負數都是以補碼的形式進行儲存的,《計算機原理》顯示,計算機內部採用2的補碼(Two's Complement)表示負數。
3、這就出現了在Python裡面需要將負數和0xffffffff進行與操作,來去掉負數前面的負號,可以理解為超過32位的東西就不進行考慮了,這進行與操作的具體步驟是:如果是正數,直接與;如果是負數,先去掉最前面的負號,再取反,再加1,再進行與操作。從而得到負數的補碼。
因此對於輸出的a我們也要進行截斷,但是不能簡單粗暴地直接&0xffffffff, 因為這樣做的話-1加1是對了,結果是正數的也沒問題,但是如果本來結果是負數的,這樣就又出奇怪結果了。最後真正的解決方案如下:
例項
def getSum(a,b): while b!=0: ta = a a = a^b b = ((ta&b)<<1)&0xffffffff hibit = (a&0x80000000)>>31 if hibit==1: return -(((~a)+1)&0xffffffff) else: return a&0xffffffff
其原理是先透過第32位符號位判斷是否負數,是負數則先去反加1再截斷,最後加上負號;正數則直接截斷。結果號稱簡潔,容易的Python版本變成了這樣,太奇葩了。
4、所以可以檢視自己的寫的劍指Offer的:二進位制中1的個數的求解。對於c++程式和python程式的區別(負數補碼的區別)。
而且在這道題目裡面,還要注意和1相減進行與操作的計算方式求解個數
5、求解二進位制中1的個數,用python寫,就是這樣的
例項
class Solution: def NumberOf1(self, n): # write code here if n<0: n=n&0xffffffff #這個是python裡面的,python和別的語言儲存負數的格式有點區別 temp=0x00000001 count=0 for i in range(64): if n&temp: count=count+1 temp=temp<<1 return count
6、(另一個題,但是也是按位操作)二進位制(64位)中有且只有1個1(想要時間複雜度的低的關鍵),求解這個數字的的第幾位是那個1。比如輸入8,輸出4。
方法1:O(n)的時間複雜度
例項
def search_1(input_n): if input_n<0: input_n=input_n&0xffffffff temp=0x00000001 for i in range(64): if input_n&temp: return i+1 temp=temp<<1 return 0
方法2:O(logn),主要是使用二分法求解,但是關鍵的一點是需要判斷他的值的大小。其實也可以使用math.log(input_n,2)進行求解(但是這個庫函式的時間複雜度就不太清楚了)
原文地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2688108/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 對比C++和Java (轉)C++Java
- Python和Java、PHP、C、C#、C++等其他語言的對比?PythonJavaPHPC#C++
- C#學習筆記(與Java、C、C++和Python對比)C#筆記JavaC++Python
- 基於C++和Rust兩種方式擴充套件nodejs對比C++Rust套件NodeJS
- Go 與 C++ 的對比和比較GoC++
- KV儲存的對比
- 關於Java和C#的型別對比JavaC#型別
- JAVA抽象類、介面和C++的虛擬函式對比Java抽象C++函式
- C++ 對於輸出小數的位數控制+C++對集合的操作(交、並、差)C++
- C/C++浮點數在記憶體中的儲存方式C++記憶體
- java排序方式對比Java排序
- 【實測】Python 和 C++ 下字串查詢的速度對比PythonC++字串
- MySQL和Oracle對比之儲存過程MySqlOracle儲存過程
- MySQL 儲存過程引數IN OUT INOUT對比MySql儲存過程
- 2017年的golang、python、php、c++、c、java、Nodejs效能對比GolangPythonPHPC++JavaNodeJS
- Java深度拷貝方式和效能對比Java
- Kubernetes 幾種儲存方式效能對比 (轉載)
- 關於c++ STL map 和 unordered_map 的效率的對比測試C++
- Java和Python的程式設計對比JavaPython程式設計
- Java對比有引數和無引數Java
- C++入門:與Python對比第一彈C++Python
- MySQL三種InnoDB、MyISAM和MEMORY儲存引擎對比MySql儲存引擎
- 【c語言】將正數變成對應的負數,將負數變成對應的正數C語言
- 高精度加法(可以為負數)【C++版和java版】C++Java
- Python 和 Ruby 的對比Python
- Java陣列轉列表方式對比Java陣列
- java 和 Ruby On Rails的對比JavaAI
- 效能對比 Go、Python、PHP、C/C++、C# .Net、Java、Node.js、… 等多程式語言GoPythonPHPC++C#JavaNode.js
- MySQL的鍵值儲存以及與MongoDB的對比MySqlMongoDB
- 變數的儲存方式和生存期變數
- 檔案系統儲存與oracle資料庫儲存對比Oracle資料庫
- 關於beego和gin的對比Go
- 【C++】C++的位元組對齊C++
- C++ 自由儲存區是否等價於堆?C++
- 【Python】Python 對比 C語言的差異PythonC語言
- 基於 SmartX 分散式儲存的 RDMA 與 TCP/IP 技術與效能對比分散式TCP
- 據說是C++和Java的垃圾回收對比圖 碼農們感受一下C++Java
- 對拍(C++)C++