如何把十進位制的數輸入用二進位制全加器,並以十進位制輸出

簷臺軒夙發表於2019-03-25

二進位制的全加器

二進位制的演算法準則

在寫全加器前,我們先了解二進位制的演算法準則。
我們設A和B是兩個相加的二進位制數,C是從下一位獲得的進位,兩書相加的和在該位的值為Sum,全加器的兩個輸出仍然是給上一位的進位Carry。

A–B--C Sum–Carry
0–0--0 0–0
0–0--1 1–0
0–1--0 1–0
0–1--1 0–1
1–0--0 1–0
1–0--1 0–1
1–1--0 0–1
1–1--1 1–1

從上表得出,只要A、B、C中有任意兩個輸入的值是1,不管餘下的一個輸入值是多少,Carry一定會是1。即AB=1、AC=1、BC=1;即C=AB+AC+BC.
而Sum為1有四種情況,ABC、A(非B)(非C)、(非A)B(非C)、(非A)(非B)C。
那我們可以寫出全加器的前一部分

def FA(a,b,c):
    Carry = (a and b) or (b and c) or (a and c)#這兩行程式碼就是上面我們總結出的邏輯式,不要看到太多就覺得自己看不懂
    Sum = (a and b and c) or (a and (not b) and (not c)) or ((not a) and b and (not c)) or ((not a) and (not b) and c)
    return Carry,Sum

再讓我們想想我們平常做加法時,都是從個位開始計算,在計算機中也是這種方法。而當我們碰到數字不同時,會自動把缺少的那位補零,但計算機不會自己動(計算機要是什麼都會自己動我就不會在這敲鍵盤了……)。
根據上面這句話我們可以再寫一串程式碼。

def add(x,y):
    while len(x) < len(y):#用來比較兩個輸入數字的長度,下面也是
        x = [False] + x#這行程式碼就是用來補零的,下面也是
    while len(x) > len(y):
        y = [False] + y
    L = []
    Carry = False
    for i in range(len(x)-1,-1,-1):#range函式從零開始計位所以減1,-1表示逆位,-1表示間距
        Carry,Sum = FA(x[i],y[i],Carry)
        L = [Sum] + L
    return (Carry,L)

十進位制如何轉化成二進位制輸入

我們輸入一個值看看
在這裡插入圖片描述在這裡插入圖片描述
我們可以發現該函式可以輸入二進位制的數,但必須是列表形式,而且必須每個數佔一個元素。
那麼我們可以定義一個函式,首先把十進位制轉化成二進位制,再將每個數一個個取出,加入列表中。

def Deci(E,F):
    e = list(str(bin(E)))
    f = list(str(bin(F)))
    x = e[2:]#因為轉化成二進位制,前面有0b這個表示二進位制的標誌也會加入列表,所以我們從第三位開始算
    y = f[2:]
    return x,y

下圖是兩個程式碼的對比
在這裡插入圖片描述

二進位制如何以十進位制輸出

我今天想出來可以把第二個函式的結果以一個字串的形式輸出,然後替換裡面的True和False。奈斯。
前面的程式碼我改成了這個樣子

def add(x,y):
    while len(x) < len(y):
        x = [False] + x
    while len(x) > len(y):
        y = [False] + y
    L = []
    Carry = False
    for i in range(len(x)-1,-1,-1):
        Carry,Sum = FA(x[i],y[i],Carry)
        L = [Sum] + L
        l = [str(i) for i in L]#把列表裡的元素都改成字串
        list = ''.join(l)#把列表裡的字串合併成一個字串
    return str(Carry) + list#把兩個字串合併
def text(word,txt1 = 'True',txt2 = 'False',txt3 = '1',txt4 = '0'):
        word_1 = word.replace(txt1,txt3)
        word_2 = word1.replace(txt2,txt4)
        return int(word_2,2)

結果沒錯,這裡不截圖了

綜上所述

終於到了把所有函式合併的時刻了,開心。

def FA(a,b,c):
    Carry = (a and b) or (b and c) or (a and c)#這兩行程式碼就是上面我們總結出的邏輯式,不要看到太多就覺得自己看不懂
    Sum = (a and b and c) or (a and (not b) and (not c)) or ((not a) and b and (not c)) or ((not a) and (not b) and c)
    return Carry,Sum

def add(x,y):
    while len(x) < len(y):
        x = [False] + x
    while len(x) > len(y):
        y = [False] + y
    L = []
    Carry = False
    for i in range(len(x)-1,-1,-1):
        Carry,Sum = FA(x[i],y[i],Carry)
        L = [Sum] + L
        l = [str(i) for i in L]
        list = ''.join(l)
        txt = str(Carry) + list
    return txt

def text(word,txt1 = 'True',txt2 = 'False',txt3 = '1',txt4 = '0'):
    word_1 = word.replace(txt1,txt3)
    word_2 = word_1.replace(txt2,txt4)
    return int(word_2,2)

def Deci(E,F):
    e = list(str(bin(E)))
    f = list(str(bin(F)))
    x = [int(i) for i in e[2:]]
    y = [int(i) for i in f[2:]]
    word = add(x,y)
    coensored = text(word,txt1 = 'True',txt2 = 'False',txt3 = '1',txt4 = '0')
    return coensored

在這裡插入圖片描述
吶,答案沒錯。這是老師給我佈置得題目,十進位制轉化成二進位制輸入,把輸出的二進位制再轉化成十進位制的形式輸出,我能怎麼辦呢。

相關文章