Utilisation des opérations au niveau des bits (bitwise operations) pour vérifier si un nombre est une puissance de deux
Dans cette étape, nous allons explorer une méthode astucieuse pour déterminer si un nombre est une puissance de deux en utilisant les opérations au niveau des bits (bitwise operations) en Java. Cette méthode est souvent plus efficace que les approches traditionnelles basées sur des boucles (loop-based approaches).
Tout d'abord, comprenons ce qu'est une puissance de deux. Une puissance de deux est tout nombre qui peut s'exprimer comme 2 élevé à un exposant entier (par exemple, 2^0 = 1, 2^1 = 2, 2^2 = 4, 2^3 = 8, etc.). En représentation binaire, les puissances de deux ont un motif unique : elles sont représentées par un 1
suivi de zéro ou plusieurs 0
(par exemple, 1 est 1
, 2 est 10
, 4 est 100
, 8 est 1000
).
Maintenant, considérons la représentation binaire d'une puissance de deux et du nombre qui la précède immédiatement. Par exemple :
- 8 en binaire est
1000
- 7 en binaire est
0111
Si nous effectuons une opération ET au niveau des bits (&
) entre une puissance de deux et le nombre qui la précède immédiatement, le résultat est toujours zéro. En effet, la puissance de deux a un seul bit 1
, et le nombre qui la précède a des 0
à cette position et des 1
dans toutes les positions à droite.
Par exemple, 8 (1000
) & 7 (0111
) = 0000
(ce qui équivaut à 0).
Cette propriété est valable pour toutes les puissances de deux positives. Tout nombre positif qui n'est PAS une puissance de deux aura au moins deux bits 1
dans sa représentation binaire. Lorsque vous effectuez un ET au niveau des bits avec le nombre qui le précède, au moins l'un de ces bits 1
coïncidera avec un bit 1
du nombre précédent, donnant un résultat non nul.
Ainsi, la condition pour qu'un nombre positif n
soit une puissance de deux est (n & (n - 1)) == 0
.
Créons un programme Java pour implémenter cette vérification.
-
Ouvrez le fichier HelloJava.java
dans l'éditeur WebIDE.
-
Remplacez le code existant par le suivant :
public class HelloJava {
// Function to check if a number is a power of two using bitwise AND
public static boolean isPowerOfTwo(int n) {
// A number is a power of two if it's positive and (n & (n - 1)) is 0
return (n > 0) && ((n & (n - 1)) == 0);
}
public static void main(String[] args) {
int number1 = 8;
int number2 = 12;
int number3 = 1;
System.out.println(number1 + " is a power of two: " + isPowerOfTwo(number1));
System.out.println(number2 + " is a power of two: " + isPowerOfTwo(number2));
System.out.println(number3 + " is a power of two: " + isPowerOfTwo(number3));
}
}
Dans ce code :
- Nous définissons une méthode statique
isPowerOfTwo
qui prend un entier n
en entrée.
- À l'intérieur de la méthode, nous vérifions si
n
est supérieur à 0 et si l'opération ET au niveau des bits de n
et n - 1
est égale à 0.
- La méthode
main
montre comment utiliser la méthode isPowerOfTwo
avec quelques nombres d'exemple.
-
Enregistrez le fichier (Ctrl+S ou Cmd+S).
-
Compilez le programme Java dans le terminal :
javac HelloJava.java
S'il n'y a pas d'erreurs, la compilation est réussie.
-
Exécutez le programme compilé :
java HelloJava
Vous devriez voir une sortie similaire à ceci :
8 is a power of two: true
12 is a power of two: false
1 is a power of two: true
Cette sortie confirme que notre vérification au niveau des bits identifie correctement les puissances de deux.