Java Language Vérifier si un nombre est une puissance de 2


Exemple

Si un entier x est une puissance de 2, un seul bit est défini, alors que x-1 a tous les bits définis après cela. Par exemple: 4 est 100 et 3 est 011 comme nombre binaire, ce qui satisfait à la condition susmentionnée. Zéro n'est pas une puissance de 2 et doit être vérifié explicitement.

boolean isPowerOfTwo(int x)
{
    return (x != 0) && ((x & (x - 1)) == 0);
}

Utilisation pour gauche et droite

Supposons que nous ayons trois types d'autorisations, READ , WRITE et EXECUTE . Chaque autorisation peut varier de 0 à 7. (Supposons un système à 4 bits)

RESOURCE = READ WRITE EXECUTE (numéro de 12 bits)

RESSOURCE = 0100 0110 0101 = 4 6 5 (nombre de 12 bits)

Comment pouvons-nous obtenir les autorisations (nombre 12 bits) définies ci-dessus (nombre 12 bits)?

0100 0110 0101

0000 0000 0111 (&)

0000 0000 0101 = 5

Donc, voici comment nous pouvons obtenir les autorisations EXECUTE de la ressource . Maintenant, que faire si nous voulons obtenir les autorisations READ de la ressource ?

0100 0110 0101

0111 0000 0000 (&)

0100 0000 0000 = 1024

Droite? Vous supposez probablement cela? Mais, les autorisations sont obtenues dans 1024. Nous voulons obtenir uniquement des autorisations READ pour la ressource. Ne vous inquiétez pas, c'est pourquoi nous avons eu les opérateurs de quarts. Si nous voyons, les autorisations READ sont 8 bits derrière le résultat réel, donc si vous appliquez un opérateur de décalage, ce qui apportera des autorisations READ à droite du résultat? Et si on fait:

0100 0000 0000 >> 8 => 0000 0000 0100 (Parce que c'est un nombre positif, donc remplacé par 0, si vous ne vous souciez pas du signe, utilisez simplement l'opérateur de décalage non signé)

Nous avons maintenant les permissions READ qui sont 4.

Maintenant, par exemple, on nous donne des autorisations READ , WRITE , EXECUTE pour une ressource , que pouvons-nous faire pour obtenir des autorisations pour cette ressource ?

Prenons d'abord l'exemple des autorisations binaires. (En supposant toujours un système à 4 bits)

READ = 0001

WRITE = 0100

EXECUTE = 0110

Si vous pensez que nous allons simplement faire:

READ | WRITE | EXECUTE , vous avez un peu raison mais pas exactement. Voyez, que se passera-t-il si nous effectuons READ | ECRIRE | EXÉCUTER

0001 | 0100 | 0110 => 0111

Mais les autorisations sont effectivement représentées (dans notre exemple) sous la forme 0001 0100 0110

Donc, pour ce faire, nous savons que READ est placé 8 bits derrière, WRITE est placé 4 bits derrière et PERMISSIONS est placé à la dernière place. Le système de numérotation utilisé pour les autorisations RESOURCE est en fait 12 bits (dans notre exemple). Il peut (sera) différent dans différents systèmes.

(LIRE << 8) | (ECRIRE << 4) | (EXÉCUTER)

0000 0000 0001 << 8 (READ)

0001 0000 0000 (décalage gauche de 8 bits)

0000 0000 0100 << 4 (WRITE)

0000 0100 0000 (décalage à gauche de 4 bits)

0000 0000 0001 (EXECUTE)

Maintenant, si nous ajoutons les résultats du décalage ci-dessus, ce sera quelque chose comme:

0001 0000 0000 (READ)

0000 0100 0000 (WRITE)

0000 0000 0001 (EXECUTE)

0001 0100 0001 (PERMISSIONS)