如何把十進位制的數輸入用二進位制全加器,並以十進位制輸出
二進位制的全加器
二進位制的演算法準則
在寫全加器前,我們先了解二進位制的演算法準則。
我們設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
吶,答案沒錯。這是老師給我佈置得題目,十進位制轉化成二進位制輸入,把輸出的二進位制再轉化成十進位制的形式輸出,我能怎麼辦呢。
相關文章
- C++輸入十進位制數,輸出對應二進位制數、十六進位制數C++
- C語言十進位制,八進位制,十六進位制輸出分析C語言
- 對十進位制數字的按位輸出,取反,並求其位數
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- 十進位制——二 (八、十六 )進位制
- 十六進位制數轉十進位制
- printf()將10進位制數安照輸出16進位制,8進位制輸出
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- printf與scanf如何輸出、輸入十六進位制與八進位制數
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- 二進位制、十進位制與十六進位制相互轉化
- 二進位制轉十進位制快速方法
- Python 進位制互相轉換(二進位制、十進位制和十六進位制)Python
- 1474 十進位制轉m進位制+1475 m進位制轉十進位制
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- n進位制轉十進位制
- 十進位制轉十六進位制
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- 大話二進位制,八進位制,十進位制,十六進位制之間的轉換
- JavaScript 二進位制數字轉換為十進位制JavaScript
- JavaScript十進位制轉換為二進位制JavaScript
- Oracle二進位制與十進位制轉換Oracle
- 十進位制轉二進位制推導(草稿)
- Oracle中的二進位制、八進位制、十進位制、十六進位制相互轉換函式Oracle函式
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- Qt進位制轉換(十進位制轉十六進位制)QT
- 45:十進位制到八進位制
- 46:八進位制到十進位制
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機
- ORACLE使用函式對二進位制、十進位制、十六進位制數互相轉換Oracle函式
- python進位制轉換(二進位制、十進位制和十六進位制)及注意事項Python
- javascript十進位制數字和二進位制相互轉換JavaScript
- 十進位制與二進位制互相轉換指南
- 二進位制轉十進位制快速轉換方法
- 彙編實現10進位制轉16進位制並以ASCII碼輸出ASCII
- 【轉帖】Oracle中的二進位制、八進位制、十進位制、十六進位制相互轉換函式Oracle函式