Python數(shù)據(jù)結構與算法06:基本結構:棧的應用之進制轉換

:本文如涉及到代碼,均經(jīng)過Python 3.7實際運行檢驗,保證其嚴謹性。

本文閱讀時間約為9分鐘。

十進制與二進制

十進制是我們熟悉的逢十向高位進一位,如1+9=10。

二進制則是類似地逢二向更高位進一位,如1+1=10。

所謂“進制”,就是用多少個字符表示整數(shù)。十進制是用0~9這10個數(shù)字字符來表示整數(shù),而二進制則是用0、1這2個數(shù)字字符來表示整數(shù)。

拿一個例子來說,(233)_{10}(表示十進制的整數(shù)233)對應的二進制整數(shù)為(11101001)_{2}(表示二進制的整數(shù)11101001)。

十進制的表示——(233)_{10}=2*102+3*101+3*10^0。

二進制的表示——(11101001)_{2}=1*27+126+1*25+0*24+1*23+0*22+0*21+1*2^0。

最右邊的數(shù)字的指數(shù)為0,每向左1位的數(shù)字,其指數(shù)加1,如從右至左第2位數(shù)指數(shù)為1,從右至左第3位數(shù)指數(shù)為2,依次類推。

多少進制就是多少進制的幾次冪。

十進制轉換為二進制

我們經(jīng)常需要在二進制和十進制之間轉換。

十進制轉換為二進制,采用的是“除以2求余數(shù)”的算法。將整數(shù)不斷除以2,每次得到的余數(shù)就是由低到高的二進制位。

pic-304-1 十進制轉換為二進制的例子

“除以2”的過程,得到的余數(shù)是從低到高的次序,而輸出則是從高到低,這就需要一個東西來做“次序反轉”,而棧的特性正是“反轉次序”,所以棧在這里就有用武之地了。

用棧來實現(xiàn)就是:

class Stack:
    def __init__(self):
        self.items = []
        
    def isEmpty(self):
        return self.items == []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

    def peek(self):
        return self.items[len(self.items)-1]

    def size(self):
        return len(self.items)

def divideBy2(decNumber):
    remstack = Stack()
    while decNumber > 0:
        rem = decNumber % 2
        remstack.push(rem)
        decNumber = decNumber // 2
    binString = ""
    while not remstack.isEmpty():
        binString = binString + str(remstack.pop())
    return binString

print(divideBy2(42))

<<<101010
十進制轉換為N進制

上述十進制轉換為N進制的思想也可以擴展為,把十進制轉換為n進制,只需要把“除以2”改為“除以N”即可。

計算機中有另外兩種常用的進制,分別是八進制和十六進制。十六進制高于十進制,規(guī)定用A、B、C、D、E、F分別表示10、11、12、13、14、15。

八進制和十六進制的例子如下:

(233)_{10}=(351)_{8}=(E9)_{16}。

(351)_{8}=3*8^2+5*8^1+1*8^0。

(E9)_{16}=14*16^1+9*16^0。

如何表示八進制和十六進制

上述代碼改成十進制轉換為十六進制,因為十六進制高于十進制,它有ABCDEF等6個字母表示數(shù)字,所以代碼中也要有相應的改變。

以下是十進制數(shù)轉化為n進制數(shù)(n<=16)的代碼(代碼中n用base代替):

class Stack:
    def __init__(self):
        self.items = []
        
    def isEmpty(self):
        return self.items == []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

    def peek(self):
        return self.items[len(self.items)-1]

    def size(self):
        return len(self.items)

def baseConverter(decNumber, base):
    digits = "0123456789ABCDEF"
    remstack = Stack()
    while decNumber > 0:
        rem = decNumber % base
        remstack.push(rem)
        decNumber = decNumber // base
    binString = ""
    while not remstack.isEmpty():
        binString = binString + digits[remstack.pop()]
    return binString

print(baseConverter(25, 2))  # 求十進制數(shù)25轉換為二進制后的結果。
print(baseConverter(25, 16))  # 求十進制數(shù)25轉換為十六進制后的結果。。

<<<
11001
19
<<<

今天介紹的是,如何將十進制轉換為二進制。更多的進制之間的轉換后續(xù)會進一步介紹。

To be continued.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容