Accorciamento di un booleano E con terzo operando

0

Sto cercando di calcolare la somma di 2 bit usando l'aritmetica binaria di base e attualmente, sto facendo questo:

function Add(bool a, bool b, bool carry)
{
    return
    {
         Result: a ^ b ^ carry,
         Carry: a & b | a & carry | b & carry
    };
}

C'è un modo per abbreviare l'espressione che calcola il Carry o devo controllare manualmente tutte le combinazioni possibili?

    
posta DumbButterly 19.02.2017 - 18:38
fonte

4 risposte

2

C'è solo una piccola semplificazione:

a & b | (a | b) & carry

Questo è equivalente a

a & carry | (a | carry) & b

e

carry & b | (carry | b) & a
    
risposta data 19.02.2017 - 19:28
fonte
1

Se non sbaglio, puoi aggiungere bool in C. Puoi aggiungere i tre bool insieme e poi controllare se il valore è maggiore di 1. Dubito che sarebbe una buona idea dal punto di vista delle prestazioni. Potrebbe valere la pena di considerare se avessi più di tre valori booleani e volessi controllare se un determinato numero è impostato.

Mi rendo conto che questo non ha senso per ciò che si vuole fare in modo specifico ma è una soluzione per il problema più generale dei dati X bool controllare se Y (o almeno Y) sono impostati.

    
risposta data 02.03.2017 - 15:44
fonte
0

Se stai contando per operazioni e sei disposto a contare ?: come una sola operazione, puoi migliorare su questa risposta con:

carry ? (a|b) : (a&b)

Questo significa cinque operandi e tre operazioni. O forse 3,5 operazioni. Ma è ancora meglio dell'altra risposta con 4 operazioni.

Se ti concentri sull'idea che la funzione sia "qualsiasi due o più dei tre", mi piace questo modulo perché dice "Se uno è alto, uno degli altri due, altrimenti entrambi gli altri due ".

    
risposta data 02.03.2017 - 17:07
fonte
0

Pseudo codice per un sommatore generico completo (cosa stai descrivendo). La maggior parte delle lingue supporterà questo pseudo codice.

L'uso di un campo temporaneo significa che ci vorranno cinque operazioni, due OR ESCLUSIVO, due AND e un OR.

Inputs: a, b, Cin
Outputs: sum, Cout

temp = a XOR b
sum = temp XOR Cin
Cout = (a AND B) OR (temp AND Cin)
    
risposta data 02.03.2017 - 13:09
fonte

Leggi altre domande sui tag