计算数值原码、反码、补码以及补码如何运算

计算数值原码、反码、补码以及补码如何运算

  • 例子:计算原码、反码、补码
  • 例子:数值如何通过补码求和

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)]  # 初始化N位
	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


# 例子1
# 计算原码、反码、补码
num, bit_size = -10, 8
ym = YM(num, bit_size)
fm = FM(ym)
bm = BM(fm)
print ym
print fm
print bm


# 例子2
# 数值如何通过补码求和
# 计算5 + (-5)
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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值