2011-03-11 13 views
6

Sto lavorando a un compito e non riesco a capire come implementarlo. Devo fare una funzione sadd (int x, int y) che restituisce i numeri aggiunti insieme a meno che non trabocchi (quindi restituire solo il massimo possibile int). Sono stato in grado di trovare alcune soluzioni che implicano il cast e le dichiarazioni condizionali, ma quelle non sono consentite nella soluzione. Solo gli operatori ~!^+ < < >> & e |.Aggiunta saturata per bit in C (HW)

+2

Fare domande sui compiti è ok, ma dovresti taggarli come compiti. –

+3

Fai un tentativo e pubblica ciò che ti viene in mente. (Come ha detto Brian, le domande HW vanno bene, ma è meglio dare il meglio e postare il codice. Benvenuti in SO!) – John

+0

Senza 'if' /' else', questo sarà hacky .. –

risposta

6

Per l'aggiunta di numeri firmati, l'overflow si è verificato se si aggiungono due numeri dello stesso segno e si ottiene un risultato con un segno diverso. A causa delle gamme coinvolte, è impossibile generare overflow quando si aggiungono due numeri di segni diversi.

Quindi, ciò che si può fare è - guardando solo il bit del segno (il complemento più significativo su due) - utilizzare l'OR esclusivo per capire se i due numeri originali differiscono nel segno, completarlo in modo da avere '0' se erano diversi, '1' per lo stesso.

È quindi possibile utilizzare OR esclusivo sul risultato rispetto a uno degli ingressi. Questo darà "0" se fossero uguali, "1" se fossero diversi.

E questi due risultati insieme per ottenere un '1' complessivo se i due input erano uguali ma il risultato era diverso, altrimenti '0'.

È quindi possibile utilizzare una combinazione di turni e OR per riempire un intero intero con quel valore. Supponendo che tu sia in un intero a 32 bit, imposta i 31 bit più bassi per ottenere il numero intero positivo più alto. Quello che puoi fare è un insieme simile di turni e OR sul bit del segno di uno degli input. OR esclusivo i risultati. Quello restituirà invece il valore più basso intero se gli input fossero negativi.

EDIT: oh, e usa il valore del bit se c'era overflow, esteso per riempire l'int, per selezionare quale valore restituire inserendolo con il risultato che verrebbe restituito se ci fosse un overflow, completandolo e anding con il normale risultato additivo, quindi aggiungendo (o aggiungendo) i due insieme.

Presto: tutta la logica binaria, senza condizioni. Presumo, perché è compito, che non vuoi il codice vero?

+0

Ho questo codice; Non sono sicuro se sia opportuno aggiungere una risposta completa a una domanda a casa. La spiegazione che ho dato è sufficientemente chiara? – Tommy

+1

Probabilmente no, ma suggeriscigli la lunghezza delle istruzioni che la tua soluzione richiede (assumendo il set di istruzioni MIPS). Possiamo giocare al codice-golf ;-) – smci