注:本文如涉及到代码,均经过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,每次得到的余数就是由低到高的二进制位。
“除以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.