2011-03-11 19 views
6

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)

+2

Hacer preguntas sobre la tarea está bien, pero debe etiquetarlas como tarea. –

+3

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

+0

Sin 'if' /' else', esto va a ser hacky .. –

Respuesta

6

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?

+0

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

+1

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