paulo1205
(usa Ubuntu)
Enviado em 26/05/2017 - 01:50h
Usando os operadores lógicos.
Para cada bit a ser somado, por exemplo, você tem duas tabelas verdade, com três variáveis de entrada em cada uma.
Soma do n-ésimo bit (S[n]):
Entradas: n-ésimo bit de A, n-ésimo bit de B, e o vai-um do [n-1]-ésimo bit da soma (V)
+------------------+-----+-----+-----+-----+
| V[n-1]\A[n],B[n] | 0,0 | 0,1 | 1,1 | 1,0 |
+------------------+-----+-----+-----+-----+
| 0 | 0 | 1 | 0 | 1 |
+------------------+-----+-----+-----+-----+
| 1 | 1 | 0 | 1 | 0 |
+------------------+-----+-----+-----+-----+
S[n]=(A[n]&B[n]&V[n-1])|(A[n]&~B[n]&~V[n-1])|(~A[n]&~B[n]&V[n-1])|(~A[n]&B[n]&~V[n-1])
ou
S[n]=A[n]^B[n]^V[n-1] (O sinal “^” é o operador ou-exclusivo bit a bit do C.)
Vai-um do n-ésimo bit (V[n]):
Entradas: n-ésimo bit de A, n-ésimo bit de B, e o vai-um do [n-1]-ésimo bit da soma (V)
+------------------+-----+-----+-----+-----+
| V[n-1]\A[n],B[n] | 0,0 | 0,1 | 1,1 | 1,0 |
+------------------+-----+-----+-----+-----+
| 0 | 0 | 0 | 1 | 0 |
+------------------+-----+-----+-----+-----+
| 1 | 0 | 1 | 1 | 1 |
+------------------+-----+-----+-----+-----+
V[n]=(A[n]&B[n])|(A[n]&V[n-1])|(B[n]&V[n-1])
ou
V[n]=(A[n]&B[n])|(V[n-1]&(A[n]|B[n]))
Como você tem a fórmula de um
V[n] qualquer, e tanto
S[n] quanto
V[n] dependem de
V[n-1], você pode expandir esse
V[n-1].
V[n]=(A[n]&B[n])|(((A[n-1]&B[n-1])|(V[n-2]&(A[n-1]|B[n-1])))&(A[n]|B[n]))
S[n]=A[n]^B[n]^((A[n-1]&B[n-1])|(V[n-2]&(A[n-1]|B[n-1])))
Essa expansão pode ser repetida até que você só tenha como componentes os bits de
A e de
B. Quando
n=0,
A[n-1]=B[n-1]=V[n-1]=0.
Alternativamente, em lugar da expansão, você poderia usar um laço de repetição, e ir operando um bit de cada vez.