Tutoriel Java «Bit Shifting»?

Je serais reconnaissant pour un bon tutoriel, qui explique pour les débutants java comment en java tout le travail “bit shifting” fonctionne.

Je trébuche toujours dessus, mais je n’ai jamais compris comment cela fonctionne. Il devrait expliquer toutes les opérations et concepts possibles avec byteshifting / bitmanipulation dans java.

Ceci est juste un exemple de ce que je veux dire (mais je cherche un tutoriel qui explique chaque opération possible):

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

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

Si vous vous demandez “que puis-je faire avec le bit-shifting”, alors ce n’est pas spécifique à Java, et comme c’est une technique de bas niveau, je ne connais aucune liste de “choses que vous pouvez” faire en soi. Il serait utile de se familiariser avec les définitions et de garder les yeux ouverts sur les autres codes utilisés, pour voir ce qu’ils ont fait.

Notez que souvent, le bit-twiddling est un gain d’efficacité au désortingment 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 préférable d'écrire plus clairement le code avec la variable temporaire (ou même mieux, dans une méthode utilitaire). Donc, à cet égard, il est difficile de donner d'excellents exemples, car il est peu probable que vous atteigniez quelque chose de nouveau ou de profond au niveau de l'architecture. Tout est question de détails de bas niveau. (Et j'estime qu'un grand nombre d'utilisations du "bit-twiddling" dans la nature "sont des exemples d'optimisation prématurée.)

Lorsque vous utilisez l’opérateur de changement de vitesse, veillez à ne pas répéter une erreur commune !!

Comme le post SO le suggère, 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 plus petit que int redimensionne automatiquement l’opérande en un int.”

Il est essentiel de se souvenir de cela lorsque vous utilisez des octets, par exemple, sinon vous risquez d’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 mordre de 4, et assigné à un int, tel que:

 int value = byteValue >>> 4; 

Je m’attendrais à avoir:

 0000 1001 (or a value of 9) 

Mais j’aurais un énorme nombre! C’est parce que la valeur byteValue est convertie en int avant l’opération de décalage de bits, ce qui se traduit par quelque chose comme ceci:

 1111 1111 1111 1111 1111 1111 1001 

Il existe un nombre infini de combinaisons possibles. Cependant, ils seront composés d’une ou plusieurs combinaisons de

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

Pour avoir une compréhension, je vous suggère d'écrire les nombres binarys sur papier et de déterminer ce qui se passe. Essayer de le lire dans un tutoriel ne garantit pas la compréhension. esp si elles n'ont pas aidé jusqu'ici.

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

Ce n’est pas exactement un tutoriel, mais j’ai une bibliothèque personnelle de fonctions de transfert de bits en Java que vous pouvez étudier!

Aussi, si vous faites une recherche sur Google pour “astuces bitwise”, vous trouverez beaucoup de matériel. Beaucoup d’entre eux sont en C / C ++ mais sont généralement sortingvialement convertis en Java car la plupart de la syntaxe est la même.

Voici les détails de la façon dont le décalage fonctionne . Il existe un comportement non intuitif qui n’est pas couvert par le tutoriel officiel. Par exemple, l’opérande droit a une scope limitée (0-31 pour int, 0-63 pour longtemps), et ne produira pas d’avertissement si vous dépassez cette plage – il ne fera que tronquer les bits (c.-à-d.% 32 ou% 64). ), ce qui peut donner un comportement autre que celui auquel vous vous attendez.

Ce site semble donner un très bon tutoriel sur ce que vous pouvez faire avec la manipulation des bits (donc pas spécifique à java, mais facile à traduire)

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

Le tutoriel ci-dessus fournit

  • Opérations sur les bits
  • Réglage et effacement d’un bit
  • Affichage d’un entier avec des bits
  • Conversion de décimal en hexadécimal
  • Le nombre de bits dans un nombre entier (nombre de bits)
  • La position du bit d’un entier
  • Integer Integer Swap avec manipulation de bits
  • Le nombre de bits requirejs pour convertir un entier A en entier B
  • Permuter les bits impairs et pairs dans un entier
  • Qu’est-ce que (n & (n-1) == 0) vérifie?
  • Complément à deux
  • Retour au nième bit d’un nombre entier
  • Modèle de bit de nombre à virgule flottante
  • Palindrome de modèle de bit d’un entier

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

http://geekviewpoint.com/

Ce sont deux bons tutoriels que j’ai trouvés tout en apprenant le changement de bit, 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. PHP Bitwise Tutorial par Jim Plush