Estoy trabajando en una tarea y no puedo encontrar la manera de implementarla. Tengo que hacer una función sadd (int x, int y) que devuelve los números agregados a menos que se desborde (luego simplemente devuelve el máximo posible int). He podido encontrar algunas soluciones que incluyen casting y declaraciones condicionales, pero no están permitidas en la solución. ¡Solo los operadores ~!^+ < < >> & y |.Suma saturada por bit en C (HW)
Respuesta
Para la adición de números con signo, el desbordamiento ha ocurrido si agrega dos números del mismo signo y obtiene un resultado con un signo diferente. Debido a los rangos involucrados, es imposible generar desbordamiento al agregar dos números de signos diferentes.
Así que, lo que puedes hacer es mirar solo el signo (el más significativo de cada dos) - usa OR exclusivo para ver si los dos números originales difieren en el signo, complementa eso para que tengas '0' si fueran diferentes, '1' para el mismo.
Puede utilizar OR exclusivo en el resultado en lugar de una de las entradas. Eso dará '0' si fueran iguales, '1' si fueran diferentes.
Y esos dos resultados juntos para obtener un total de '1' si las dos entradas son las mismas, pero el resultado fue diferente, '0' de lo contrario.
Puede usar una combinación de turnos y OR para completar un entero con ese valor. Supongamos que está en un entero de 32 bits, solo establezca los 31 bits más bajos para obtener el entero positivo de mayor valor. Lo que puede hacer entonces es un conjunto similar de cambios y RUP en el bit de signo de cualquiera de las entradas. Exclusivo O los resultados. En su lugar, dará el valor entero más bajo si las entradas fueron negativas.
EDITAR: oh, y utilice el valor de bit de si hubo desbordamiento, se extendió para completar el int, para seleccionar qué valor devolver pulsando y con el resultado que devolvería si hubiera desbordamiento, completándolo y anding con el resultado aditivo normal, luego oring (o sumando) los dos juntos.
Presto: todo lógica binaria, sin condicionales. Supongo, porque es tarea, ¿que no quieres el código real?
Tengo este código; no estoy seguro si es apropiado agregar una respuesta de fuente completa en una pregunta de tarea. Es la explicación que he dado suficientemente clara? – Tommy
Probablemente no, pero insinúe la longitud de las instrucciones que toma su solución (suponiendo que se establezca el conjunto de instrucciones MIPS). Podemos jugar code-golf ;-) – smci
- 1. la realización de una suma bit a bit
- 2. salida extraña por bit a bit NO
- 3. Suma de comprobación de CRC con long (64 bit)
- 4. 64 bit enum en C++?
- 5. bit a bit de sustracción en Python
- 6. desplazamientos de bit en C++
- 7. Adición saturada de dos valores 'largos' de Java firmados
- 8. C/C++ Bit haciendo girar
- 9. Tipo de devolución de operadores bit a bit en C++
- 10. Invertir 1 bit en C#
- 11. ¿Cómo se utilizan las marcas bit a bit en C++?
- 12. Determine si mi PC admite HW Virtualization
- 13. operaciones bit a bit en Postgres
- 14. MongoDB: ordena por dos campos suma
- 15. ¿Por qué cambiar de bit?
- 16. Suma matriz por número en numpy
- 17. Indicadores de bit a bit en Delphi
- 18. C# Access 64 bit Registro
- 19. AND bit a bit/NO de VB.NET a C#
- 20. C# convertir bit a booleano
- 21. Patrón de bit inverso en C
- 22. C++ bit fields and -Wconversion
- 23. Reemplazar bit menos significativo con operaciones bit a bit
- 24. ¿Las operaciones bit a bit siguen siendo prácticas?
- 25. ¿Por qué es esto más rápido en 64 bit que en 32 bit?
- 26. La conversión de Ghostscript Postscript a PNG está sobre saturada
- 27. Python: aritmética bit a bit sin signo de 32 bit
- 28. Operador bit a bit en SQLAlchemy
- 29. Operaciones bit a bit en el corto
- 30. operadores bit a bit en Postgres
Hacer preguntas sobre la tarea está bien, pero debe etiquetarlas como tarea. –
Pruébalo y publica lo que se te ocurra. (Como dijo Brian, las preguntas sobre HW están bien, pero es mejor darle la mejor oportunidad y publicar tu código. ¡Bienvenido a SO!) – John
Sin 'if' /' else', esto va a ser hacky .. –