在你学习计算机的过程中,你可能已经接触了二进制。二进制在计算机科学中是很重要的,因为存储在计算机内的所有值都是以
0
和
1
存储的。如果没有能力在二进制数和普通字符串之间转换,我们与计算机之间的交互非常棘手。
整数值是常见的数据项。他们一直用于计算机程序和计算。我们在数学课上学习它们,当然最后用十进制或者基数
10
来表示它们。十进制
233^10
以及对应的二进制表示
11101001^2
分别解释为
2 * 10^2 + 3 * 10^1 +3 *10^0
1*2^7 + 1*2^6+1*2^5…..+1*2^0
“除2”算法假定我们从大于0的整数开始。不断迭代的将十进制除以2,并跟踪余数。第一个除以2的余数说明了这个值是偶数还是奇数。偶数有0的余数,记为0。奇数有余数1,记为1.我们将得到的二进制构建为数字序列,第一个余数实际上是序列中的最后一个数字。见我们再次看到了反转的属性,表示栈可能是解决这个问题的数据结构。
比如:
233 / 2 =116 rem =1
116 /2 =58 rem =0
58 / 2 =29 rem =0
29 /2 =14 rem=1
14 /2 =7 rem =0
7 / 2 =3 rem=1
3 /2 =1 rem =1
1 / 2 =0 rem =1
我们得到余数的顺序是从上往下得到的,但是我们要的二进制是从下往上的。利用栈的特性,先得到的入栈,这样最后入栈的反而在栈顶上。
代码如下:
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
return 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)
同理,我们也可以处理8,16进制。但是16进制存在一个问题就是他不是0-10,是0-F。我们用一个字符串来稍微替换一下,代码如下:(栈的代码请自行补充)
def baseConverter(decNumber,base):
digits = "0123456789ABCDEF"
remstack = Stack()
while decNumber >0 :
rem = decNumber % base
remstack.push(rem)
decNumber = decNumber / base
newString = ""
while not remstack.isEmpty():
newString = newString +digits[remstack.pop()]
return newString
#print baseConverter(25,2)
#print baseConverter(233,16)
#print baseConverter(25,16)