Python 在对二进制数进行加减后获得不同的值
我的代码中有一个问题,我首先将字符串编码为二进制,在结果中添加一个二进制数,然后再减去相同的二进制数。但我得到的值与初始值不同 我正在使用以下代码将字符串转换为二进制数:Python 在对二进制数进行加减后获得不同的值,python,python-3.x,Python,Python 3.x,我的代码中有一个问题,我首先将字符串编码为二进制,在结果中添加一个二进制数,然后再减去相同的二进制数。但我得到的值与初始值不同 我正在使用以下代码将字符串转换为二进制数: name = "hani123" 但不幸的是,我得到了不同的结果:name=hani125。请查看我的代码,找出我的问题所在。我正在使用spyder软件Python3.6。谢谢 以下是不使用2的补码的减法: def sub_binary_nums(x,y): max_len = max(len(x), len(y))
name = "hani123"
但不幸的是,我得到了不同的结果:name=hani125。请查看我的代码,找出我的问题所在。我正在使用spyder软件Python3.6。谢谢 以下是不使用2的补码的减法:
def sub_binary_nums(x,y):
max_len = max(len(x), len(y))
x = x.zfill(max_len)
y = y.zfill(max_len)
result = ''
carry = 0
for i in range(max_len-1, -1, -1):
r = 1 if x[i] == '1' else 0
r -= 1 if y[i] == '1' else 0
r -= carry
result = ('1' if r % 2 == 1 else '0') + result
carry = 1 if r < 0 else 0
if carry !=0 : result = '1' + result
return result
如果不是这样,只需注释掉这一行:
# not necessary: if carry !=0 : result = '1' + result
最后,我们很少在Python中使用索引。例如,您可以这样更改循环(查看zip
和reversed
函数),这样执行的成本更低。但是我想你练习的重点是检查加法/减法,而不是用Python编程
def sub_binary_nums(x,y):
max_len = max(len(x), len(y))
x = x.zfill(max_len)
y = y.zfill(max_len)
result = ''
carry = 0
for xbit, ybit in zip(reversed(x), reversed(y)):
r = 1 if xbit == '1' else 0
r -= 1 if ybit == '1' else 0
r -= carry
result = ('1' if r % 2 == 1 else '0') + result
carry = 1 if r < 0 else 0
#if carry !=0 : result = '1' + result
return result
def sub_binary_nums(x,y):
max_len=max(len(x),len(y))
x=x.zfill(最大长度)
y=y.zfill(最大长度)
结果=“”
进位=0
对于xbit,zip中的ybit(反转(x),反转(y)):
如果xbit='1'则r=1,否则为0
如果ybit==1,则r-=1,否则为0
r-=进位
结果=('1'如果r%2==1,则为'0')+结果
如果r<0,则进位=1,否则为0
#如果携带=0:结果='1'+结果
返回结果
减法中的代码令人困惑,您将负数r
与正数carry
混合在一起,并且比较的是r
和正值。你应该重构这一部分,错误很可能是从那里来的。你能试着在减法二进制的这一部分帮助我吗,因为它不会给我错误,只是给我不同的答案。试着把减法看成是2的补码的加法。在这里,您以类似方式处理x和y位,这对于减法是不可能的(如果执行1-0
和0-1
,进位的行为不应相同)。所以通常,你把y
,加上1(或使用进位),然后再加上一个。你能解释更多吗,我不明白,试着把我的代码改清楚,先生。谢谢这是你需要写解码器的家庭作业吗?
def sub_binary_nums(x,y):
max_len = max(len(x), len(y))
x = x.zfill(max_len)
y = y.zfill(max_len)
result = ''
carry = 0
for xbit, ybit in zip(reversed(x), reversed(y)):
r = 1 if xbit == '1' else 0
r -= 1 if ybit == '1' else 0
r -= carry
result = ('1' if r % 2 == 1 else '0') + result
carry = 1 if r < 0 else 0
#if carry !=0 : result = '1' + result
return result