Python数据结构与算法06:基本结构:栈的应用之进制转换

:本文如涉及到代码,均经过Python 3.7实际运行检验,保证其严谨性。

本文阅读时间约为9分钟

十进制与二进制

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

二进制则是类似地逢二向更高位进一位,如1+1=10。

所谓“进制”,就是用多少个字符表示整数。十进制是用0~9这10个数字字符来表示整数,而二进制则是用0、1这2个数字字符来表示整数。

拿一个例子来说,(233)_{10}(表示十进制的整数233)对应的二进制整数为(11101001)_{2}(表示二进制的整数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。

最右边的数字的指数为0,每向左1位的数字,其指数加1,如从右至左第2位数指数为1,从右至左第3位数指数为2,依次类推。

多少进制就是多少进制的几次幂。

十进制转换为二进制

我们经常需要在二进制和十进制之间转换。

十进制转换为二进制,采用的是“除以2求余数”的算法。将整数不断除以2,每次得到的余数就是由低到高的二进制位。

pic-304-1 十进制转换为二进制的例子

“除以2”的过程,得到的余数是从低到高的次序,而输出则是从高到低,这就需要一个东西来做“次序反转”,而栈的特性正是“反转次序”,所以栈在这里就有用武之地了。

用栈来实现就是:

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”即可。

计算机中有另外两种常用的进制,分别是八进制和十六进制。十六进制高于十进制,规定用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个字母表示数字,所以代码中也要有相应的改变。

以下是十进制数转化为n进制数(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))  # 求十进制数25转换为二进制后的结果。
print(baseConverter(25, 16))  # 求十进制数25转换为十六进制后的结果。。

<<<
11001
19
<<<

今天介绍的是,如何将十进制转换为二进制。更多的进制之间的转换后续会进一步介绍。

To be continued.

你可能感兴趣的:(Python数据结构与算法06:基本结构:栈的应用之进制转换)