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)
risposta
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?
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
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
- 1. C'è una differenza tra "aggiunta" e "aggiunta bit per bit"?
- 2. Aggiunta saturata di due valori "long" Java firmati
- 3. Campi bit in C#
- 4. Bit rotazione in C
- 5. turni bit in C++
- 6. operazioni bit per bit in Postgres
- 7. Aggiunta saturi firmata di 64 bit?
- 8. È possibile creare un sintetizzatore basato su HW per RTL?
- 9. La conversione Ghostscript di Postscript in PNG è sovra-saturata
- 10. 8 bit enum, in C
- 11. Campi bit nidificati in C/C++
- 12. impostando i bit in C
- 13. Impostazione bit in Ansi C
- 14. Tipo di ritorno di operatori bit a bit in C++
- 15. Digita bit di bit sicuri (r) in C++?
- 16. Libreria manipolazione bit per ANSI C
- 17. ritorno di operazione bit a bit in C
- 18. Compilatore 64 bit C per Windows 7
- 19. Qual è l'inverso di AND bit a bit in C#?
- 20. OR bit per bit delle costanti
- 21. Come ottengo i dati bit per bit da un valore intero in C?
- 22. C++ enumerazioni multiple in un argomento di funzione utilizzando bit per bit o "|"
- 23. sizeof (long) in C++ a 64 bit
- 24. Usando una maschera di bit in C#
- 25. Come invertire a bit AND (&) in C?
- 26. Schema di bit inverso in C
- 27. bool array vs bit array in C
- 28. Fare un particolare bit "0" in C++
- 29. RC4 crittografia 128 bit in C#
- 30. Matrice di bit efficiente C/C++
Fare domande sui compiti è ok, ma dovresti taggarli come compiti. –
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
Senza 'if' /' else', questo sarà hacky .. –