Addition saturée au niveau du bit en C (HW)

Je travaille sur une mission et je ne vois pas comment la mettre en œuvre. Je dois créer une fonction sadd (int x, int y) qui renvoie les nombres ajoutés ensemble à moins qu’elle ne déborde (il suffit alors de renvoyer le maximum possible int). J’ai été en mesure de proposer des solutions impliquant le transtypage et les instructions conditionnelles, mais elles ne sont pas autorisées dans la solution. Seuls les opérateurs ~! ^ + <> & et |.

Pour l’ajout de numéros signés, un débordement s’est produit si vous ajoutez deux numéros du même signe et obtenez un résultat avec un signe différent. En raison des plages impliquées, il est impossible de générer un débordement lors de l’ajout de deux nombres de signes différents.

Vous ne pouvez donc regarder que le bit de signe (le complément le plus significatif en deux): utilisez OU exclusif pour savoir si les deux nombres originaux différaient par un signe, complétez-le pour que vous obteniez 0. ils étaient différents, ‘1’ pour le même.

Vous pouvez ensuite utiliser OU exclusif sur le résultat par rapport à l’une des entrées. Cela donnera “0” s’ils étaient identiques, “1” s’ils étaient différents.

Et ces deux résultats ensemble pour obtenir un «1» global si les deux entrées sont identiques mais que le résultat est différent, «0» sinon.

Vous pouvez ensuite utiliser une combinaison de décalages et de OU pour remplir un entier entier avec cette valeur. En supposant que vous soyez dans un entier de 32 bits, il suffit de définir les 31 bits les plus bas pour obtenir le nombre entier positif le plus élevé. Ce que vous pouvez alors faire, ce sont des ensembles similaires de décalages et de OU sur le bit de signe de l’une des entrées. Exclusif OU les résultats. Cela donnera plutôt la valeur la plus basse si les entrées étaient négatives.

EDIT: oh, et utilisez la valeur de bit indiquant s’il ya eu dépassement, étendue pour remplir l’int, pour sélectionner la valeur à renvoyer en indiquant le résultat renvoyé en cas de dépassement, en le complétant et en respectant le résultat résultat additif, puis oring (ou addition) les deux ensemble.

Presto: toute logique binary, pas de condition. Je suppose que, parce que c’est un devoir, vous ne voulez pas de code réel?