Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在对二进制数进行加减后获得不同的值_Python_Python 3.x - Fatal编程技术网

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