簡體   English   中英

二進制數加減后得到不同的值

[英]Getting a different value after adding and subtracting a binary number

我的代碼有問題,我首先將字符串編碼為二進制,將二進制數添加到結果中,然后再次減去相同的二進制數。 但是我得到的值與初始值不同。

我正在使用以下代碼將字符串轉換為二進制數:

name = "hani123"

但不幸的是,我得到了不同的結果: name= hani125 能否請查看我的代碼並找出我的問題所在。 我正在使用 spyder 軟件 python 3.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

請注意,在原始代碼中,您以相同的方式處理xy ,就像加法一樣,但這不合邏輯: X “上升”而y “下降”。 我重寫了那部分來展示我們人類如何處理減法。

你不需要調整結果的大小,所以我也刪除了它。

在負值的情況下,您的結果將有一個額外的 MSB 位為“1”,我不確定您是否想要這樣?

> sub_binary_nums('000', '001')
> '1111'

如果不是這種情況,只需注釋掉這一行:

    # not necessary: if carry !=0 : result = '1' + result

最后,我們很少在 Python 中使用索引。 例如,您可以像這樣更改循環(查看zipreversed函數),這樣執行起來成本更低。 但我想你練習的重點是檢查加法/減法,而不是用 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM