[10 vues] 2021-11-30 Emmanuel Orchanian
NOTE : cet article a été affiché dans sa langue originale.
À vous les matheux !
Énoncé de l'énigme :
Soit N égal à 0 ou à 1, comment, en une seule opération, avoir 0 si N vaut 1, et 1 si N vaut 0 ?
Pendant que certains réfléchissent, je vais expliquer à quoi ça pourrait servir.
Problématique
Je ne conseille pas d'utiliser le type BOOLEAN dans les bases de données, et de préférer un entier qui vaut 0 pour FAUX, et 1 pour VRAI.
Par ailleurs, je ne conseille pas d'utiliser -1 pour le FAUX, car ça embrouille, en effet dans les transtypages de JavaScript et PHP (c'est-à-dire quand on transforme le type int en bool) le -1 vaut VRAI...
Besoin d'alterner un booléen
Le booléen c'est deux états par définition, on peux le faire modifier par l'internaute de deux manières (généralement).
Avec deux interactions
- Quand c'est activé
- Quand c'est désactivé
Dans la mentalité, on lance deux programmes différents, l'un qui active, l'autre qui désactive.
Avec une seule interaction
- Quand c'est activé
- Quand c'est désactivé
Ici, le but est de lancer un seul programme.
C'est ce que nous utiliserons ici, on utilisera la même chose pour que en un seul code, ça alterne notre 0 ou 1.
Solutions
Voici quelques solutions possibles :
La solution facile
N deviens égal à 1 - N
(à ne pas confondre avec N-1)
Si N vaut 0 : 1 - N = 1 - 0 = 1
Si N vaut 1 : 1 - N = 1 - 1 = 0
Attention ! Ça ne fonctionne pas avec N - 1 (ne confondez pas N-1 et 1-N), en effet, si N vaut 0, alors N vaudra -1, puis s'il vaut -1, il vaudra -2, puis -3 -4 -5... et il y aura des erreurs à la chaîne...
C'était facile, toutefois il existe des cas où on ne peux pas forcément faire cette soustraction, voici d'autres alternatives.
La valeur absolue
N deviens égal à ABS(N - 1)
ABS est la valeur absolue, ça enlève le signe d'un nombre, par exemple ABS(-5) vaut 5, et ABS(5) vaut aussi 5. ABS(0) vaut 0.
À l'école on avait l'habitude de le noter avec deux traits verticaux |-5|
Si N vaut 0 : ABS(N - 1) = ABS(0 - 1) = ABS(-1) = 1
Si N vaut 1 : ABS(N - 1) = ABS(1 - 1) = ABS(0) = 0
Le carré
N deviens égal à (N - 1) * (N - 1)
Si N vaut 0 : (N - 1) * (N - 1) = (0 - 1) * (0 - 1) = (-1) * (-1) = 1
Si N vaut 1 : (N - 1) * (N - 1) = (1 - 1) * (1 - 1) = (0) * (0) = 0 * 0 =
la tête à toto
Cas pratique
SQL
En SQL, on peux l'utiliser pour alterner directement notre booléen (sous forme d'entier 0 ou 1)
UPDATE article SET actif = 1 - actif WHERE id=462346
Ici on a l'état "actif" de l'article qui va alterner entre 0 et 1.
JavaScript et PHP
Vous pouvez utiliser l'opérateur XOR sur les bits, mais faite toujours de telle sorte que vos collègues comprennent votre code :
toto ^= 1 ; // Si toto vaut 0, il vaudra 1. S'il vaut 1, il vaudra alors 0
Note : pas besoin de vérifier si toto est un entier, l'opérateur ^= transforme automatiquement le type (transtypage automatique) en int, ainsi donc cela fonctionnerait aussi si toto vallait "001" ou un booléen true/false.
Merci d'avoir lu !
Si en général vous avez une question, une curiosité, n'hésitez pas me contacter.