1. 程式人生 > >python 3 實現

python 3 實現

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
'''