[英]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
請注意,在原始代碼中,您以相同的方式處理x
和y
,就像加法一樣,但這不合邏輯: X
“上升”而y
“下降”。 我重寫了那部分來展示我們人類如何處理減法。
你不需要調整結果的大小,所以我也刪除了它。
在負值的情況下,您的結果將有一個額外的 MSB 位為“1”,我不確定您是否想要這樣?
> sub_binary_nums('000', '001')
> '1111'
如果不是這種情況,只需注釋掉這一行:
# 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.