79 votes

Java : Vérifier si un bit est égal à 0 ou 1 dans un fichier long

Quelle méthode utiliseriez-vous pour déterminer si le bit qui représente 2^x est un 1 ou un 0 ?

186voto

Jon Skeet Points 692016

Je l'utiliserais :

if ((value & (1L << x)) != 0)
{
   // The bit was set
}

(Vous pouvez peut-être vous en sortir avec moins de parenthèses, mais je ne me souviens jamais de la préséance des opérations par bit).

1 votes

Par curiosité : pourquoi avez-vous préféré le décalage à gauche de 1 au décalage à droite de la valeur ?

53 votes

Cela dépend de la langue. En java, ce n'est pas vrai.

12 votes

Cela devrait être 1L, ou (1 << 32) se retrouve avec la même valeur que (1 << 0).

100voto

finnw Points 24592

Une autre alternative :

if (BigInteger.valueOf(value).testBit(x)) {
    // ...
}

42 votes

+1 pour l'utilisation d'un code compréhensible par les futurs mainteneurs

9 votes

Ce n'est pas une très bonne solution si ce code doit être appelé souvent. Vous remplacez une alternative d'une ligne par une alternative d'une ligne, et les décalages de bits ne sont vraiment pas si difficiles.

3 votes

Longueur de la ligne != lisibilité de la ligne, wds. Vous avez peut-être raison de dire que la solution précédente est plus efficace, mais la différence est probablement marginale, surtout si testBit() est inlined.

15voto

Ande Points 2787

Je me demande si :

  if (((value >>> x) & 1) != 0) {

  }

.. est meilleur parce qu'il n'est pas important que la valeur soit longue ou non, ou si c'est pire parce que c'est moins évident.

Tom Hawtin - tackline 7 juillet à 14:16

0 votes

Je pense que c'est mieux parce qu'il y a moins de risques d'erreurs - et si vous pensez que ce n'est pas évident, vous pouvez toujours extraire le test dans une fonction au nom approprié (boolean isBitSet(long value, int x) ou autre).

13voto

ThibThib Points 3709

Vous pouvez également utiliser

bool isSet = ((value>>x) & 1) != 0;

EDIT : la différence entre " (value>>x) & 1 " et " value & (1<<x) " repose sur le comportement lorsque x est supérieur à la taille du type de "valeur" (32 dans votre cas).

Dans ce cas particulier, avec " (value>>x) & 1 ", vous aurez le signe de la valeur, alors que vous obtenez un 0 avec " value & (1<<x) "(il est parfois utile d'obtenir le signe du bit si x est trop grand).

Si vous préférez avoir un 0 dans ce cas, vous pouvez utiliser l'option " >>> "au lieu de l'opérateur " >> "

Alors, " ((value>>>x) & 1) != 0 " et " (value & (1<<x)) != 0 "sont complètement équivalents

8voto

Noldorin Points 67794

Pour le n e LSB (bit le moins significatif), la formule suivante devrait fonctionner :

boolean isSet = (value & (1 << n)) != 0;

9 votes

Cela devrait être 1L, ou (1 << 32) se retrouve avec la même valeur que (1 << 0).

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