Les codeurs fous n'auront aucun mal avec ces petits problèmes, pour les autres c'est une bonne occasion de découvrir les subtilités de l'informatique.
Dans un ordinateur, les nombres entiers sont représentés via des bits, qui correspondent à l'écriture de ces nombres en base 2. Par exemple, 37 s'écrit 100101 en binaire
Par ailleurs, un processeur propose un jeu d'instructions, plus ou moins coûteuses en temps. Par exemple, "Comparer deux nombres" ou "Faire une division de deux nombres".
Parmi les opérations les moins coûteuses, on trouve
- les opérateurs logiques
* ET, qui agit sur 2 bits et donne comme résultat 1 si et seulement si les deux bits valent 1,
* OU, qui agit sur 2 bits et donne comme résultat 1 si et seulement si l'un des deux bits au moins vaut 1,
* XOR ou OU EXCLUSIF, qui agit sur 2 bits et donne comme résultat 1 si et seulement si un et un seul des deux bits vaut 1
- les décalages
* DÉCALAGE DROITE décale tous les bits d'un nombre d'un certain nombre de crans vers la droite
* DÉCALAGE GAUCHE décale tous les bits d'un nombre d'un certain nombre de crans vers la gauche
- certains indicateurs de tests
* Savoir si le dernier résultat vaut 0
Parmi les opérations un peu plus coûteuses, on trouve
- les opérateurs arithmétiques + et -
Parmi les opérations encore plus coûteuses, on trouve
- les opérateurs arithmétiques * et /, ainsi que le modulo
Sachant tout cela, quel est le moyen le plus rapide de répondre à ces questions, en utilisant uniquement les opérations ci-dessus et de préférence les moins coûteuses?
1.1) Comment multiplier un nombre par 2 ?
1.2) Comment multiplier un nombre par 2^n ?
2.1) Comment diviser un nombre par 2 ?
2.2) Comment diviser un nombre par 2^n ?
3) Comment savoir si deux nombres sont identiques ?
4.1) Comment calculer le modulo 2 d'un nombre ?
4.2) Comment calculer le modulo 2^n d'un nombre ?
5) Comment savoir si un nombre est une puissance de 2 ?
6) Comment savoir si la somme de deux nombres vaut 1 de moins qu'une puissance de 2?