注:本文如涉及到代碼,均經(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ù)就是由低到高的二進制位。

“除以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.