52 votes

Valeur absolue abs(x) à l'aide d'opérateurs au niveau du bit et de la logique booléenne

Comment cela marche-t-il?

L'idée est de faire en sorte que abs(x) utilise des opérateurs au niveau du bit pour les entiers (en supposant des mots de 32 bits) :

 y = x >> 31
(x + y) ^ y // This gives abs(x) (is ^ XOR)?

18voto

Ayxan Points 5803

Cette approche repose sur de nombreux comportements spécifiques à l'implémentation :

  1. Il suppose que x largeur de 32 bits. Cependant, vous pouvez résoudre ce problème par x >> (sizeof(x) * CHAR_BIT - 1)
  2. Il suppose que la machine utilise la représentation du complément à deux.
  3. l'opérateur de décalage à droite copie le bit de signe de gauche à droite.

Exemple avec 3 bits :

 101 -> x = -3
111 -> x >> 2

101 + 111 = 100 -> x + y

100 XOR 111 -> 011 -> 3

Ce n'est pas portable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X