计算数值原码、反码、补码以及补码如何运算
- 例子:计算原码、反码、补码
- 例子:数值如何通过补码求和
def changeDecToR(num, r=2):
"""十进制转为R进制
整数部分:“除以R取余”法
小数部分:“乘以R取整”法
:param num: 需要转换的十进制数
:param r: 目标进制
:return: 转后后的进制值
"""
lstInt = []
lstFloat = []
_int = int(num)
_float = num - _int
while _int:
lstInt.append(_int % r)
_int = _int / r
while _float:
_float = _float * r
lstFloat.append(int(_float))
_float = _float - int(_float)
lstInt.reverse()
strR = ""
for i in lstInt:
strR += str(i)
if lstFloat:
if not strR:
strR = "0"
strR += "."
for i in lstFloat:
strR += str(i)
return strR
def changeRToDec(num, r=2):
"""R进制转为十进制
:param num: R进制值
:param r: R进制
:return: 十进制值
"""
lstD = []
strR = str(num)
lstR = [strR[i] for i in range(len(strR))]
index = strR.find(".")
if index == -1:
index = len(lstR)
for i in range(len(lstR)):
if i == index:
continue
n = int(lstR[i])
if index > i:
lstD.append(n * pow(r, index - i - 1))
elif index < i:
lstD.append(n * pow(r, index - i))
return sum(lstD)
def YM(num, bit_size=8):
"""获取原码
"""
lstYM = [0 for i in range(bit_size)]
lstYM[0] = 0 if num >= 0 else 1
strR = changeDecToR(abs(num), 2)
lstR = [int(strR[i]) for i in range(len(strR))]
lstR.reverse()
for i in range(len(lstR)):
lstYM[len(lstYM) - i - 1] = lstR[i]
return lstYM
def FM(lstYM):
"""获取反码
"""
if lstYM[0] == 0:
return lstYM
lstFM = [0 for i in range(len(lstYM))]
lstFM[0] = lstYM[0]
for i in range(1, len(lstFM)):
ym = lstYM[i]
if ym == 0:
fm = 1
else:
fm = 0
lstFM[i] = fm
return lstFM
def BM(lstFM):
"""获取补码
"""
if lstFM[0] == 0:
return lstFM
lstBM = lstFM
lstBM[len(lstBM) - 1] += 1
for i in range(len(lstBM)):
index = len(lstBM) - i - 1
if index < 0:
break
if lstBM[index] == 2:
lstBM[index] = 0
if index - 1 < 0:
break
else:
lstBM[index - 1] += 1
return lstBM
num, bit_size = -10, 8
ym = YM(num, bit_size)
fm = FM(ym)
bm = BM(fm)
print ym
print fm
print bm
def Cal(num1, num2, bit_size=8):
bm1 = BM(FM(YM(num1, bit_size)))
bm2 = BM(FM(YM(num2, bit_size)))
print "补码1-%s" % bm1
print "补码2-%s" % bm2
sum_bm12 = [bm1[i] + bm2[i] for i in range(len(bm1))]
for i in range(len(sum_bm12)):
index = len(sum_bm12) - i - 1
if index < 0:
break
if sum_bm12[index] == 2:
sum_bm12[index] = 0
if index - 1 < 0:
break
else:
sum_bm12[index - 1] += 1
print "补码和-%s" % sum_bm12
bm_sum_bm12 = BM(FM(sum_bm12))
print "补码的补码-%s" % bm_sum_bm12
strNum = ""
for i in bm_sum_bm12:
strNum += str(i)
sumOf12 = changeRToDec(strNum, 2)
print "%s + %s = %s" % (num1, num2, sumOf12)
Cal(5, -4)