python 3 實現
阿新 • • 發佈:2019-01-03
import numpy as np print((1024).to_bytes(2, byteorder = 'big')) print((65536).to_bytes(8, byteorder = 'little')) print((-1024).to_bytes(4, byteorder = 'big', signed = True)) print((-1024).to_bytes(4, byteorder = 'little', signed = True)) print((500).to_bytes(2, byteorder = 'big')) print((3345).to_bytes(2, byteorder = 'big')) # why \r\x11 print((3124).to_bytes(2, byteorder = 'big')) # why \x0c4 => \x0c + 4(0x34) print((3140).to_bytes(2, byteorder ='little')) # why D\x0c => D(0x44) + 0x0c print('%x' % 3345) print('%x' % 3124) print(0xd11) print(0xc34) b = b'china\r\nus' print(type(b)) s = b.decode() # decode 解碼 print(s) print(s.encode()) # encode 編碼 b'china\r\nus' print('10 ** 2 <=> power(10, 2) 10的2次方 = ' , 10 ** 2 ,np.power(10, 2)) print('返回商的整數部分 23 // 5 = ',23 // 5) print('左移位 16 << 2 = ' , 16 << 2) print('右移位 70 >> 1 = ' , 70 >> 1) # 與/或/異或 print(0b1101 & 0b1011) # 0b1001 = 9 print(0b1101 | 0b1011) # 0b1111 = 15 print(0b1101 ^ 0b1011) # 0b0110 = 6 ''' Python 進位制轉換 二進位制 八進位制 十進位制 十六進位制 地址:http://www.cnblogs.com/txw1958/p/python3-scale.html ord() 函式是 chr() 函式(對於8位的ASCII字串)或 unichr() 函式(對於Unicode物件)的配對函式, 它以一個字元(長度為1的字串)作為引數,返回對應的 ASCII 數值,或者 Unicode 數值, 如果所給的 Unicode 字元超出了你的 Python 定義範圍,則會引發一個 TypeError 的異常。 ord('a') # 返回值是對應的十進位制整數 97 ord('A') # 65 chr(65) # A ''' base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'),ord('A')+6)] print( base ) # ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'] def bin2dec(string_num): # 二進位制 to 十進位制 int(str,n=10) return str(int(string_num, 2)) aa = '110101010' print( bin2dec(aa) ) # 426 def hex2dec(string_num): # 十六進位制 to 十進位制 return str(int(string_num.upper(), 16)) aa = 'ff0000' print( hex2dec(aa) ) # 16711680 def dec2bin(string_num): # 十進位制 to 二進位制: bin() num = int(string_num) mid = [] while True: if num == 0: break num,rem = divmod(num, 2) mid.append(base[rem]) return ''.join([str(x) for x in mid[::-1]]) def dec2hexOrOct(string_num,toDivMod=16): # 十進位制 to 十六進位制: hex() 或 八進位制: oct() num = int(string_num) mid = [] while True: if num == 0: break num,rem = divmod(num, toDivMod) mid.append(base[rem]) return ''.join([str(x) for x in mid[::-1]]) aa = '16711680' print( dec2hexOrOct(aa,16) ) # FF0000 print( dec2hexOrOct(aa,8) ) # 77600000 def hex2bin(string_num): # 十六進位制 to 二進位制: bin(int(str,16)) return dec2bin(hex2dec(string_num.upper())) print( '十六進位制 to 二進位制 : hex2bin(str) = ' , hex2bin('ff0000') ) # 111111110000000000000000 print( '二進位制 to 十六進位制 : hex(int(str,2)) = ' , hex(int('0100',2)) ) # int('0100',2) 4 print('Python內建函式 bin 獲取一個整形數字的二進位制表示' , bin(-11) ) print( format(14, '#b'), format(14, 'b'), format(-14, 'b') ) ''' 可以看到bin函式返回二進位制數字表示的形式是採用了負號,而不是補碼的形式。 那麼如何獲得補碼形式的二進位制表示呢,很簡單隻需要對數值進行與操作就可以。 ''' # 這個例子手工指定了位數,也可以用下面帶引數的形式 print( bin(-27 & 0b1111111111111111) ) def bindigits(n, bits): s = bin(n & int("1"*bits, 2))[2:] return ("{0:0>%s}" % (bits)).format(s) print (bindigits(-31337, 24),'\n',len(bindigits(-31337, 24))) # 111111111000010110010111 ''' 例項1:通過位運算實現加法 ''' class Solution(): def aplusb(self,a ,b): while b != 0: ans = a ^ b b = (a&b)<<1 a = ans return a ''' # LintCode - 程式設計面試題線上訓練平臺 https://www.lintcode.com/zh-cn/accounts/signup/ ''' test_ = Solution().aplusb(-8,-9) print( ' test_ = ' ,test_ ) ''' 正負數二進位制表示,正負數二進位制移位運算、二進位制原始碼、反碼、補碼 第一位是符號位, 所以8位二進位制數的取值範圍就是: [1111 1111 , 0111 1111] 即 [-127 , 127] 1、原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值. [+1] 的原碼 = 0000 0001 [-1] 的原碼 = 1000 0001 2、反碼 [+1] = [00000001]原 = [00000001]反 # 正數的反碼是其本身 [-1] = [10000001]原 = [11111110]反 # 負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反 3、補碼 [+1] = [00000001]原 = [00000001]反 = [00000001]補 # 正數的補碼就是其本身 [-1] = [10000001]原 = [11111110]反 = [11111111]補 # 負數的補碼是在其反碼的基礎上+1 【-1】 原碼 10000001 反碼11111110 補碼 11111111 【3】 原碼 00000011 反碼 00000011 補碼 00000011 【-127】原碼11111111 反碼 10000000 補碼 10000001 【127】 原碼 01111111 反碼 01111111 補碼 01111111 4、位運算 注意:首先要明白一點,二進位制移位操作都是針對儲存在計算機中中二進位制的操作, 正數在計算機中是用二進位制表示的,負數在計算機中使用補碼錶示的。 左移位:<< 有符號的移位操作 左移操作時將運算數的二進位制碼整體左移指定位數,左移之後的空位用0補充 右移位:>> 有符號的移位操作 右移操作是將運算數的二進位制碼整體右移指定位數,右移之後的空位用符號位補充,如果是正數用0補充,負數用1補充。 ''' print(3<<2) # 3左移2位 print(-3<<2) # -3左移2位 ''' 解釋: 3 正數,在計算機中用二進位制表示 00000000 00000000 00000000 00000011 00 00000000 00000000 00000000 00001100 左移兩位右邊補00 結果為12 2 的3次方 + 2的2次方 = 12 -3 負數 ,在計算機中用二進位制補碼錶示 求-3的補碼,根據上面的方法 負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1. 10000000 00000000 00000000 00000011 -3原始碼 11111111 11111111 11111111 11111100 -3反碼 11111111 11111111 11111111 11111101 -3補碼 11 11111111 11111111 11111111 11110100 左移兩位右邊補00 第一位是1 說明是個負數,那就是某個負數的補碼。求出原始碼就能知道是哪個負數 11111111 11111111 11111111 11110100 # 去掉移動的兩位11 11111111 11111111 11111111 11110011 # 減一 10000000 00000000 00000000 00001100 # 第一位不變,其他為取反。得到 原始碼。 所以此負數為 -12 ''' print(6>>2) # 6右移2位 print(-6>>2) # -6右移2位 ''' 6 正數,在計算機中顯示二進位制 00000000 00000000 00000000 00000110 6的原始碼 00000000 00000000 00000000 00000001 右移兩位,正數右移,左邊補0 。結果為 1 -6 負數,在計算機中應該顯示補碼 00000000 00000000 00000000 00000110 6 的原始碼 負數的補碼是其原碼, 除符號位不變各個位取反, 最後+1 求出補碼 11111111 11111111 11111111 11111010 -6 的補碼 負數右移,左邊空缺用 符號位1 補齊 11111111 11111111 11111111 11111110 此為答案數字的補碼。是個負數 求此負數原始碼(補碼 - 1 ,再除符號位各個位取反) 10000000 00000000 00000000 00000010 此為答案 -2 ''' ''' 二進位制邏輯運算 邏輯變數之間的運算稱為邏輯運算。二進位制數1和0在邏輯上可代表"真"與"假"、"是"與"否"、"有"與"無"。 這種具有邏輯屬性的變數就稱為邏輯變數。 基本概念 計算機的邏輯運算的算術運算的主要區別是:邏輯運算是按位進行的,位與位之間不像加減運算那樣有進位或借位的聯絡。 邏輯運算主要包括三種基本運算:邏輯加法(又稱"或"運算)、邏輯乘法(又稱"與"運算)和邏輯否定(又稱"非"運算)。 此外,"異或"運算也很有用。 二進位制是逢2進位的進位制。0、1是基本算符。現代的電子計算機技術全部採用的是二進位制,因為它只使用0、1兩個數字符號,非常簡單方便,易於用電子方式實現。 邏輯運算子 在形式邏輯中,邏輯運算子或邏輯聯結詞把語句連線成更復雜的複雜語句。 例如,假設有兩個邏輯命題,分別是"正在下雨"和"我在屋裡", 可將它們組成複雜命題"正在下雨,並且我在屋裡"或"沒有正在下雨"或"如果正在下雨,那麼我在屋裡"。 一個將兩個語句組成的新的語句或命題叫做複合語句或複合命題。 演算法 邏輯 加"+" 或("∨" 或 "||") 運算 邏輯加法通常用符號"+"或"∨"來表示。邏輯加法運算規則如下: 0+0=0, 0∨0=0 0+1=1, 0∨1=1 1+0=1, 1∨0=1 1+1=1, 1∨1=1 從上式可見,邏輯加法有"或"的意義。 在給定的邏輯變數中,A或B只要有一個為1,其邏輯加的結果就為1; 只有當兩者都為0時邏輯加的結果才為0。 邏輯 乘法"×" 與( "∧" 或 "&") 運算 邏輯乘法通常用符號"×"或"∧"或"·"來表示。邏輯乘法運算規則如下: 0×0=0, 0∧0=0, 0·0=0 0×1=0, 0∧1=0, 0·1=0 1×0=0, 1∧0=0, 1·0=0 1×1=1, 1∧1=1, 1·1=1 不難看出,邏輯乘法有"與"的意義。它表示只當參與運算的邏輯變數都同時取值為1時,其邏輯乘積才等於1。 邏輯非運算又稱邏輯否運算。其運算規則為: 0=1 "非"0等於1 1=0 "非"1等於0 異或運算("半加"運算,因為全是1結果為0)通常用符號"⊕" 或 "^"表示, 其運算規則為 相同為 0 不同為 1: 所以有 3^3=0 0^3=3 0⊕0=0 0同0異或,結果為0 0⊕1=1 0同1異或,結果為1 1⊕0=1 1同0異或,結果為1 1⊕1=0 1同1異或,結果為0 即兩個邏輯變數相異,輸出才為1 '''