SiriBlog

siriyang的个人博客


  • 首页

  • 排行榜

  • 标签115

  • 分类37

  • 归档320

  • 关于

  • 搜索

补码一位乘法(Python实现)

发表于 2019-08-08 更新于 2021-10-29 分类于 计算机 , 理论 , 计算机组成原理 阅读次数: Valine:
本文字数: 5.1k 阅读时长 ≈ 5 分钟
基于Python语言实现的补码一位乘法算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# -*- coding:utf-8 -*-
"""
@author:SiriYang
@file:Complement_one_multiplication.py
@time:2018/9/29 17:06
"""


def tostring(list):
str = ''
for i in range(len(list)):
str = str + '{n}'.format(n=list[i])
return str


def fan(n):
if n == 1:
return 0
else:
return 1


def zhen2yuan(zhen):
yuan = []
flag = False
for i in range(len(zhen)):
if i == 0:
if zhen[i] == '-':
yuan.append(1)
else:
yuan.append(0)
else:
if zhen[i] == '.':
flag = True
if flag:
if zhen[i] == '0':
yuan.append(0)
elif zhen[i] == '1':
yuan.append(1)
return yuan


def yuan2bu(yuan):
if yuan[0] == 0:
return yuan
bu = []
flag = 0
for i in range(1, len(yuan)):
if yuan[len(yuan) - i] == 1:
flag = len(yuan) - i
break

bu.append(yuan[0])

count = 0
for i in range(1, len(yuan)):
if i < flag:
bu.append(fan(yuan[i]))
else:
bu.append(yuan[i])
if yuan[i] == 0:
count += 1

if count == len(yuan) - 1:
bu[0] = 0

return bu


def bianbu(bu):
bianbu = []
flag = 0
for i in range(1, len(bu)):
if bu[len(bu) - i] == 1:
flag = len(bu) - i
break

for i in range(len(bu)):
if i < flag:
bianbu.append(fan(bu[i]))
else:
bianbu.append(bu[i])

return bianbu


def twofu(input):
twofu = []
twofu.append(input[0])
twofu.append(input[0])
for i in range(1, len(input)):
twofu.append(input[i])

return twofu


def twofuadd(A, B):
for i in range(len(A)):
A[i] += B[i]

for i in range(len(A)):
if i != len(A) - 1:
A[len(A) - i - 2] += (int)(A[len(A) - i - 1] / 2)
A[len(A) - i - 1] = (int)(A[len(A) - i - 1] % 2)
return A


"""
-0.1101
-0.1011
"""
if __name__ == '__main__':

# 数据输入
# X = input()
# Y = input()
X = '-0.1101'
Y = '0.1011'

# 前期准备
A = [0, 0, 0, 0, 0, 0] # 累加器

Xyuan = zhen2yuan(X) # X源码
Yyuan = zhen2yuan(Y) # Y源码

Xbu = yuan2bu(Xyuan) # X补
Ybu = yuan2bu(Yyuan) # Y补

B = twofu(Xbu) # 双符号位X补
fanB = twofu(bianbu(Xbu)) # 双符号位-X补
C = Ybu # Y补

# 计算开始
print("步数 条件 操作 A C Cn+1")
for step in range(len(C)):

if step == 0:
C.append(0)
print(" CnCn+1 {A} {C} {Cnp1}".format(A=tostring(A), C=tostring(C[:-1]),
Cnp1=C[-1]))
else:
t = []
t.append(A[len(A) - 1])
for i in range(len(C) - 1):
t.append(C[i])
C = t

for i in range(3):
A[len(A) - i - 1] = A[len(A) - i - 2]
A[2] = A[1]
print(' -> {A} {C} {Cnp1}'.format(A=tostring(A), C=tostring(C[:-1]),
Cnp1=C[-1]))

caozuo = ''
beicheng = [0, 0, 0, 0, 0, 0]
if C[-1] - C[-2] == 0:
caozuo = ' 0'
elif C[-1] - C[-2] == 1:
caozuo = '+B'
beicheng = B
else:
caozuo = '-B'
beicheng = fanB

print('第{step}步 {pr1}{pr2} {caozuo} +{beicheng}'.format(step=step + 1, pr1=C[-2], pr2=C[-1],
caozuo=caozuo,
beicheng=tostring(beicheng)))
print(' ----------')

A = twofuadd(A, beicheng)

if step == len(C) - 2:
print(' {A} {C}'.format(A=tostring(A), C=tostring(C[:-1])))
else:
print(" {A}".format(A=tostring(A)))

for i in range(len(C) - 2):
A.append(C[i])

print('[XY]补=', tostring(A[1:]))

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
步数       条件      操作        A        C          Cn+1
CnCn+1 000000 01011 0
第1步 10 -B +001101
----------
001101
-> 000110 10101 1
第2步 11 0 +000000
----------
000110
-> 000011 01010 1
第3步 01 +B +110011
----------
110110
-> 111011 00101 0
第4步 10 -B +001101
----------
001000
-> 000100 00010 1
第5步 01 +B +110011
----------
110111 00010
[XY]补= 101110001
-------- 本文结束 感谢阅读 --------
相关文章
  • 计算机组成原理期末复习知识点
  • 自己动手写一个相机参数水印生成器
  • 个人数据中心:使用腾讯云函数进行任务调度
  • 个人数据中心:获取Switch游戏记录
  • 个人数据中心:获取Steam游戏记录
觉得文章写的不错的话,请我喝瓶怡宝吧!😀
SiriYang 微信支付

微信支付

SiriYang 支付宝

支付宝

  • 本文标题: 补码一位乘法(Python实现)
  • 本文作者: SiriYang
  • 创建时间: 2019年08月08日 - 17时08分
  • 修改时间: 2021年10月29日 - 18时10分
  • 本文链接: https://blog.siriyang.cn/posts/20190808175350id.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
Python 理论 计算机组成原理
阅读的逻辑
Hello World
  • 文章目录
  • 站点概览
SiriYang

SiriYang

努力搬砖攒钱买镜头的摄影迷
320 日志
33 分类
88 标签
RSS
GitHub E-Mail
Creative Commons
Links
  • 友情链接
  • 作品商铺

  1. 运行结果:
蜀ICP备19008337号 © 2019 – 2025 SiriYang | 1.7m | 25:41
0%