最近在學習極客時間的課程--程序員的數學基礎課。html
課程地址:time.geekbang.org/column/intr…python
這是第一節課程的學習筆記--有關進制的轉換。git
十進制計數是使用 10 做爲基數,例如一個數字:2871,它是十進制表示,也就是程序員
二進制則採用 2 做爲基數,它的數位是的形式。例如二進制數字
110101
,它轉換爲十進制的表示過程以下:github
根據這個思路,八進制(以 8 爲基數)和十六進制(以 16 爲基數)等計數方法其實也是一樣的道理,和十進制的轉換也是一樣的作法。微信
利用 Python 代碼實現二進制和十進制的轉換,以下所示:機器學習
# 十進制轉二進制的方法:除2取餘,逆序排列, https://blog.csdn.net/shirley_sweet/article/details/73896279
def change(n):
result = '0'
if n == 0: # 輸入爲0的狀況
return result
else:
result = change(n // 2) # 調用自身
return result + str(n % 2)
def decimal_to_binary(decimal_val):
''' 十進制轉爲二進制 :param decimal_val: :return: '''
print('transfer %d to binary' % decimal_val)
recursion_result = change(decimal_val)
print('遞歸實現轉換結果:', recursion_result)
def binary_to_decimal_func(val):
''' 按照定義來實現,即 2^n 的形式 :param val: str :return: '''
print('original val: ', val)
numbers = len(val)
result = 0
for i in range(numbers):
result += int(val[i]) * pow(2, numbers - i - 1)
return result
def binary_to_decimal(val):
''' 二進制轉十進制 :param val: :return: '''
decimal2 = binary_to_decimal_func(str(val))
print('第二種轉換二進制爲十進制:', decimal2)
複製代碼
實際上,Python 有內建函數能夠直接實現這幾個進制之間的轉換,好比bin
、oct
、hex
分別表示將十進制數轉換爲二進制、八進制和十六進制,而將其餘進制轉換爲十進制,則能夠用int(val, base)
函數,只是須要注意輸入值val
必須是字符串,而後設置base
參數爲當前輸入值所用的進制,好比二進制天然是設置base=2
,代碼以下所示:函數
def binary_to_decimal(val):
''' 二進制轉十進制 :param val: :return: '''
# 第一種方法,內建函數--int(),輸入值必須是字符串形式
decimal = int(str(val), 2)
print('二進制數爲: 0b%d' % val)
print('二進制轉換爲十進制爲:', decimal)
def decimal_to_other_build_function(dec):
''' 採用內建函數將十進制轉換 參考 http://www.runoob.com/python3/python3-conversion-binary-octal-hexadecimal.html :param dec: :return: '''
print("十進制數爲:", dec)
print("轉換爲二進制爲:", bin(dec))
print("轉換爲八進制爲:", oct(dec))
print("轉換爲十六進制爲:", hex(dec))
複製代碼
二進制左移一位,表示將數字翻倍,即乘以 2 ,但左移須要注意數字溢出的問題,須要考慮當前採用的變量類型位數,好比是int16
類型,即只有 16 位數,那麼就要考慮當前數值的位數是否達到 16 位了;學習
二進制右移一位,則表示將數字除以 2 ,並使用整數商,注意右移分爲算術右移和符號右移,這是由於符號位的緣由,通常符號位是0,表示該數值爲正數;符號位是1,表示該數值是負數。測試
對於邏輯右移,須要在右移後在左邊補上符號位,即正數補 0,負數補 1 ;
對於算術右移,就是保持符號位不動,其他位數右移。
在 Java 語言中,邏輯右移採用>>>
表示,算術右移是>>
表示,但 Python 並無>>>
運算符實現邏輯右移的操做。
簡單的實現左移操做和算術右移操做:
def left_shift(val, n):
''' 左移操做 :param val: :param n: 移動的位數 :return: '''
print('二進制數爲: 0b%d' % val)
val = int(str(val), 2)
print('十進制數值:', val)
result = val << n
print('left shift %d, result=%s' % (n, result))
result = bin(int(result))
print('left shift {}, result={}'.format(n, result))
def right_shift(val, n):
''' 右移操做 :param val: :param n: :return: '''
print('二進制數爲: 0b%d' % val)
val = int(str(val), 2)
print('十進制數值:', val)
math_val = val >> n
print('right shift {}, math_val={}'.format(n, math_val))
result = bin(int(math_val))
print('left shift {}, result={}'.format(n, result))
複製代碼
測試代碼以下:
binary_val = 100101
# 輸出結果是 0b1001010
left_shift(binary_val, 1)
# 輸出結果是 0b10010
right_shift(binary_val, 1)
複製代碼
代碼實現以下:
def logic_operation(val1, val2):
''' 二進制的邏輯運算,與、或、非以及異或操做 :param val1: :param val2: :return: '''
print('orginal val:{},{}'.format(val1, val2))
dec_val1 = int(str(val1), 2)
dec_val2 = int(str(val2), 2)
print('decimal val:{},{}'.format(dec_val1, dec_val2))
and_result = dec_val1 & dec_val2
or_result = dec_val1 | dec_val2
not_result1 = ~dec_val1
not_result2 = ~dec_val2
different_or_result = dec_val1 ^ dec_val2
print('and result:', bin(int(and_result)))
print('or result:', bin(int(or_result)))
print('not result1:', bin(int(not_result1)))
print('not result2:', bin(int(not_result2)))
print('different or result:', bin(int(different_or_result)))
if __name__ == '__main__':
binary_val = 100101
binary_val2 = 110100
logic_operation(binary_val, binary_val2)
複製代碼
測試的兩個二進制數值分別是100101
和110100
,輸出結果以下,這裏非的操做會實現按位取反,對於有符號數,若是是正數就會變爲一個負數。
orginal val:100101,110100
decimal val:37,52
and result: 0b100100
or result: 0b110101
not result1: -0b100110
not result2: -0b110101
different or result: 0b10001
複製代碼
上述源代碼的地址是:
歡迎關注個人微信公衆號--機器學習與計算機視覺,或者掃描下方的二維碼,你們一塊兒交流,學習和進步!