程序員的數學筆記1--進制轉換

最近在學習極客時間的課程--程序員的數學基礎課。html

課程地址:time.geekbang.org/column/intr…python

這是第一節課程的學習筆記--有關進制的轉換。git


二進制

什麼是二進制

十進制計數是使用 10 做爲基數,例如一個數字:2871,它是十進制表示,也就是程序員

2871 = 2×1000+8×100+7×10+1=2×10^3+8×10^2+7×10^1+1×10^0

二進制則採用 2 做爲基數,它的數位是2^n的形式。例如二進制數字110101,它轉換爲十進制的表示過程以下:github

1×2^5+1×2^4+0×2^3+1×2^2+0×2^1+1×2^0
= 32 + 16+0+4+0+1=53

根據這個思路,八進制(以 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 有內建函數能夠直接實現這幾個進制之間的轉換,好比binocthex分別表示將十進制數轉換爲二進制、八進制和十六進制,而將其餘進制轉換爲十進制,則能夠用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))
複製代碼

計算機爲何使用二進制?

  1. 二進制的數據表達具備抗干擾能力強、可靠性高的優勢;
  2. 二進制很是適合邏輯運算;
  3. 組成計算機系統的邏輯電路一般只有兩個狀態,即開關的接通和斷開。

二進制的位操做

移位操做

二進制左移一位,表示將數字翻倍,即乘以 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)
複製代碼
邏輯操做
  • :參與操做的位中只要有一個是 1,最終結果就是 1;
  • :參與操做的位必須都是 1,最終結果纔是 1, 不然就是 0;
  • 異或:參與操做的位相同,最終結果就是 0, 不然是 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)
複製代碼

測試的兩個二進制數值分別是100101110100,輸出結果以下,這裏非的操做會實現按位取反,對於有符號數,若是是正數就會變爲一個負數。

orginal val:100101,110100
decimal val:37,52
and result: 0b100100
or result: 0b110101
not result1: -0b100110
not result2: -0b110101
different or result: 0b10001
複製代碼

上述源代碼的地址是:

github.com/ccc013/Code…


歡迎關注個人微信公衆號--機器學習與計算機視覺,或者掃描下方的二維碼,你們一塊兒交流,學習和進步!

相關文章
相關標籤/搜索