python3的位移操作
生活随笔
收集整理的這篇文章主要介紹了
python3的位移操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
因為要將js的一個簽名算法移植到python上,遇到一些麻煩。
int無限寬度,不會溢出
算法中需要用到了32位int的溢出來參與運算,但是python的int是不會溢出的,達到界限后會自己轉為long,所以很麻煩。
#使用-342686650: ret = 123456789 << 20 print(ret) 得到結果129453825982464 print(bin(ret)) 這個二進制是11101011011110011010001010100000000000000000000 明顯已經超出32位了在JS上 document.writeln(123456789 << 20); 得到結果是-783286272 這就是溢出后截取的,在python上想實現溢出效果,找到一個函數 #這個函數可以得到32位int溢出結果,因為python的int一旦超過寬度就會自動轉為long,永遠不會溢出,有的結果卻需要溢出的int作為參數繼續參與運算 def int_overflow(val):maxint = 2147483647if not -maxint-1 <= val <= maxint:val = (val + (maxint + 1)) % (2 * (maxint + 1)) - maxint - 1return valret = int_overflow(123456789 << 20) print(ret) print(bin(ret)) 現在得到結果是-783286272 二進制:-101110101100000000000000000000負數使用無符號右移>>>
在JS中,可以使用 a>>>b來實現無符號位移,python中沒有這個運算符,只能自己實現了
無符號右移>>>,就是將有符號int a和b轉為無符號uint后,再進行普通右移>>運算
比如-1的有符號int就是-1,無符號int就是4294967295
我們自己實現>>>可以這樣
鏈接:https://www.jianshu.com/p/24d11ab44ae6
?
?
總結
以上是生活随笔為你收集整理的python3的位移操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python里面数组拼接方法介绍
- 下一篇: Ubuntu16.04安装Mininet