web-dev-qa-db-fra.com

Java Tutoriel "Bit Shifting"?

Je serais reconnaissant pour un bon tutoriel, qui explique pour Java les débutants comment dans Java tout le "bit shifting" fonctionne).

Je tombe toujours dessus, mais je n'ai jamais compris comment cela fonctionne. Il doit expliquer toutes les opérations et tous les concepts possibles avec le byteshifting/bitmanipulation en Java.

Ceci est juste un exemple de ce que je veux dire (mais je cherche un tutoriel qui explique toutes les opérations possibles):

byte b = (byte)(l >> (8 - i << 3));
46
Markus

Eh bien, le tutoriel officiel Java Opérateurs Bitwise et Bit Shift couvre les opérations réelles qui sont disponibles en Java, et comment les invoquer.

Si vous vous demandez "que puis-je faire avec le décalage de bits", alors ce n'est pas Java spécifique, et comme c'est une technique de bas niveau, je ne connais aucune liste de "cool" les choses que vous pouvez "faire en soi. Il vaudrait la peine de se familiariser avec les définitions et de garder les yeux ouverts pour d'autres codes où cela est utilisé, pour voir ce qu'ils ont fait.

Notez que le bit-twiddling est souvent un gain d'efficacité au détriment de la clarté. Par exemple, a << 1 est généralement identique à a * 2 mais sans doute moins clair. Les XOR répétés peuvent échanger deux nombres sans utiliser de variable temporaire, mais il est généralement considéré comme une meilleure forme pour écrire le code plus clairement avec la variable temporaire (ou encore mieux) , dans une méthode utilitaire). À cet égard, il est difficile de donner de bons exemples, car il est peu probable que vous réalisiez quelque chose de nouveau ou de profond au niveau de l'architecture; tout tourne autour des détails de bas niveau. (Et j'estime qu'un grand nombre d'utilisations du bit-twiddling "à l'état sauvage" sont des exemples d'optimisation prématurée.)

34
Andrzej Doyle

Lorsque vous utilisez l'opérateur de décalage, faites très attention à ne pas répéter une erreur courante !!

Comme le suggère SO post , l'auteur de la réponse acceptée mentionne:

"Dans certaines langues, l'application des opérateurs de décalage à tout type de données inférieur à int redimensionne automatiquement l'opérande pour en faire un int."

Ceci est absolument crucial à retenir lors de l'utilisation d'octets par exemple, sinon vous pourriez obtenir des résultats inattendus (comme je l'ai fait).

Étant donné un octet avec le modèle de bits suivant:

1001 0000

Lorsque j'ai essayé de décaler le bit par 4, et assigné à un int, tel que:

int value = byteValue >>> 4;

Je m'attendrais à avoir:

0000 1001   (or a value of 9)

Mais j'obtiendrais un ÉNORME numéro! C'est parce que le byteValue est casté en int [~ # ~] avant [~ # ~] l'opération de décalage de bit , aboutissant ainsi à quelque chose comme ceci à la place:

1111 1111 1111 1111 1111 1111 1001
15
Jeach

Il existe une infinité de combinaisons possibles. Cependant, ils seront constitués d'une ou plusieurs combinaisons de

>> shift right with sign extension.
>>> shift right with out sign extension.
<< shift left.

Pour comprendre, je vous suggère d'écrire les nombres binaires sur papier et de déterminer ce qui se passe. Essayer de le lire dans un tutoriel ne garantit pas la compréhension. surtout s'ils n'ont pas aidé jusqu'à présent.

13
Peter Lawrey

Il y a un tutoriel simple mais clair que je trouve utile ici

9
msb

Voici les détails du fonctionnement du décalage de bits . Il existe un comportement non intuitif qui n'est pas couvert par le didacticiel officiel. Par exemple, l'opérande de droite a une plage limitée (0-31 pour int, 0-63 pour long), et ne produira pas d'avertissement si vous dépassez cette plage - il tronquera simplement les bits (c'est-à-dire% 32 ou% 64 ), qui peut donner un comportement autre que celui auquel vous vous attendez.

5
adam.r

Ce n'est pas exactement un tutoriel, mais j'ai un personnel bibliothèque de fonctions de décalage de bits in Java que vous êtes les bienvenus pour étudier!

De plus, si vous effectuez une recherche Google pour "trucs au niveau du bit" , vous trouverez beaucoup de matériel. Beaucoup d'entre eux sont en C/C++ mais sont généralement triviaux à convertir en Java car la plupart de la syntaxe est la même.

5
mikera

Ce site semble donner un assez bon tutoriel sur ce que vous pouvez faire avec la manipulation de bits (donc pas spécifique à Java mais comme il est assez facile à traduire)

http://www.bogotobogo.com/cplusplus/quiz_bit_manipulation.html

Le tutoriel ci-dessus fournit

  • Opérations au niveau du bit
  • Définition et effacement d'un bit
  • Affichage d'un entier avec des bits
  • Conversion décimale en hexadécimal
  • Le nombre de bits défini dans un entier (nombre d'unités)
  • La position de l'ensemble de bits d'un entier
  • Échange d'entiers sur place avec manipulation de bits
  • Le nombre de bits requis pour convertir un entier A en entier B
  • Échangez les bits pairs et impairs dans un entier
  • Qu'est-ce que (n & (n-1) == 0) vérifie?
  • Complément à deux
  • Inverser le nième bit d'un entier
  • Modèle de bit de nombre à virgule flottante
  • Palindrome de configuration binaire d'un entier

Voici un fichier qui a un tas d'implémentations Java

http://geekviewpoint.com/

3
i8abug

Ce sont deux bons tutoriels que j'ai trouvés en découvrant le décalage de bits, ils ne sont pas en Java mais la plupart des langages utilisent les mêmes opérateurs et la théorie est la même.

  1. Bit twiddling
  2. Tutoriel PHP Bitwise par Jim Plush
2
mike