86 votes

Définir un bit spécifique dans l'octet

J'essaie de définir des bits dans une variable d'octet Java. Il fournit des méthodes pratiques comme .setBit(i) . Quelqu'un sait-il comment je peux réaliser cela ?

Je peux itérer bit par bit sur un octet donné :

if( (my_byte & (1 << i)) == 0 ){

}

Cependant, je ne peux pas régler cette position sur 1 ou 0, n'est-ce pas ?

0 votes

0 votes

@phuclv C'est une question C/C++, pas une question Java.

0 votes

@MarkRotteveel la même syntaxe est utilisée. En fait, la balise devrait être renommée en quelque chose comme C-like.

159voto

driis Points 70872

Utilisez l'option "bitwise OU ( | ) et Y ( & ) opérateurs. Pour activer un bit, à savoir tourner le bit à pos a 1 :

my_byte = my_byte | (1 << pos);   // longer version, or
my_byte |= 1 << pos;              // shorthand

Pour débloquer un bit, ou le tourner vers 0 :

my_byte = my_byte & ~(1 << pos);  // longer version, or
my_byte &= ~(1 << pos);           // shorthand

Pour des exemples, voir Opérateurs Java/Bitwise avancés

3 votes

Voir aussi l'opérateur xor -- c'est le troisième outil de cet arsenal (voir l'article de Wikipedia sur le masquage).

0 votes

Wow. c'est en fait un truc informatique de base mais ça m'a quand même époustouflé, le monde binaire est impressionnant

72voto

Jon Skeet Points 692016

Pour régler un peu :

myByte |= 1 << bit;

Pour le nettoyer :

myByte &= ~(1 << bit);

1 votes

Que voulez-vous dire par "définir" un bit ? Disons que vous essayez d'accéder au 0ème bit, et que mon octet contient 11101101. Qu'est-ce que cela signifie ? Comment puis-je contrôler la valeur qui est définie ?

9 votes

Michael : Mettre un bit à 1 signifie le mettre à 1. Effacer un bit signifie le mettre à 0.

30voto

Carlos Heuberger Points 11804

Juste pour compléter La réponse de Jon y réponse de driis

Pour basculer (inverser) un bit

    myByte ^= 1 << bit;

1 votes

@ernesto mais cela ne répond pas spécifiquement à la question. Il a demandé comment activer le bit, pas comment le faire basculer. Il y a une différence. Bien sûr, vous pourriez d'abord vérifier le bit, puis le basculer si nécessaire, mais ce serait également deux tâches distinctes...

11voto

Jeffrey Hantin Points 19272

La technique dont vous avez besoin consiste à isoler le bit choisi et à l'activer ou le désactiver. Vous avez déjà l'expression pour isoler le bit puisque vous l'utilisez pour le tester ci-dessus. Vous pouvez activer le bit en l'associant par OU, ou l'annuler en effectuant un ET par bit avec le complément à 1 du bit.

boolean setBit;
my_byte = setBit
          ? myByte | (1 << i)
          : myByte & ~(1 << i);

9voto

sebyku Points 89

Veuillez consulter la classe java.util.BitSet qui fait le travail pour vous.

Pour régler : myByte.set(bit); Pour réinitialiser : myByte.clear(bit); A remplir avec un bool : myByte.set(bit, b); Pour obtenir le bool : b = myByte.get(bit); Obtenir le bitmap : byte bitMap = myByte.toByteArray()[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