Java “Décalage De Bits” Tutoriel?
Je serais reconnaissant pour un bon tutoriel, qui expliquent pour java débutants comment en java tous les "le décalage de bits" de travail.
J'ai toujours tomber sur elle, mais n'a jamais compris comment il fonctionne. Il doit expliquer toutes les opérations et les concepts qui sont possibles avec byteshifting/bitmanipulation en java.
C'est juste un exemple de ce que je veux dire, (mais je suis à la recherche d'un tutoriel qui explique tout le fonctionnement):
byte b = (byte)(l >> (8 - i << 3));
- C'est bit décalage, pas d'octet décalage.
- merci, j'ai mis à jour l'en-tête (vous avez été plus rapide;-)
- Vous voudrez peut-être jeter un oeil à cette page : stackoverflow.com/questions/141525/...
- Pour tous ceux qui sont intéressés, outre les réponses ci-dessous, le lien de Mike ci-dessus, est absolut vaut la peine d'être lu!
Vous devez vous connecter pour publier un commentaire.
Bien, l'officiel de Java tutoriel Au niveau du bit et les Opérateurs de Décalage de Bits couvre les activités réelles qui sont disponibles dans Java, et la façon de les invoquer.
Si vous vous demandez "que puis-je faire avec un décalage de bits", alors ce n'est pas Java spécifique, et puisqu'elle est d'un faible niveau technique, je ne suis pas au courant d'une liste de "choses cool que vous pouvez" faire soi. Il vaut la peine de se familiariser avec les définitions, et de garder vos yeux ouverts pour un autre code où il est utilisé, pour voir ce qu'ils ont fait.
Remarque que, souvent, peu-tourner est un gain d'efficacité au détriment de la clarté. Par exemple,
a << 1
est généralement le même quea * 2
mais sans doute moins clair. Répété XORs pouvez permuter les deux nombres sans utiliser une variable temporaire, mais il est généralement considéré comme une meilleure forme pour écrire du code plus clairement avec la variable temporaire (ou encore mieux, dans une méthode utilitaire). Donc, à cet égard, il est difficile de donner de bons exemples, parce que vous n'êtes pas susceptible de réaliser quelque chose de nouveau ou profonde sur une architecture de niveau; il est tout au sujet des détails de bas niveau. (Et je serais estimer qu'un grand nombre d'utilisations de bit-tourner "dans la nature" sont des instances de l'optimisation prématurée.)1 << i
mieux que(int)Math.pow(2,i)
(pouri
dans l'intervalle 0 .. 31).Math.pow
ici, car il déclare l'intention. Le fait que les entiers sont mis en œuvre selon les coulisses du fait de la puissance de deux arithmétique peut s'exprimer en moins de personnages (et peut-être CPU cyles) comme<<
est un accident de matériel. En général, les opérateurs au niveau du bit devrait (à mon humble avis) être utilisée uniquement lorsque l'objet est vraiment une séquence d'octets, et vous êtes en train de faire quelque chose comme le hachage/crypto/compression/etc. - sinon vous risquez de créer en écriture seule code.double
valeurs. (Et, depuis Java est déjà utilisé^
pour bit-à-bit/logique XOR, on n'obtient pas un tel opérateur.) Je pense juste1 << i
pourraient être autorisés (avec peut-être un commentaire// 2^i
ou tel).Lors de l'utilisation de l'opérateur de décalage, être très prudent de ne pas répéter une erreur commune!!
Comme suit DONC, après les l'indique, l'auteur de la accepté de répondre mentionne:
Cela est absolument crucial de se rappeler lors de l'utilisation sur octets par exemple, sinon vous risquez d'obtenir des résultats inattendus (comme je l'ai fait).
Donné un octet avec le bit suivant modèle:
Quand j'ai essayé de décalage de bits par 4, et attribué à un int, tels que:
Je m'attends à avoir:
Mais je voudrais obtenir un grand nombre! C'est parce que la byteValue est coulé à l'int AVANT le décalage de bits de fonctionnement, ce qui entraîne dans quelque chose comme ceci à la place:
Il y a un nombre infini de combinaisons possibles. Toutefois, ils seront composés d'une ou de plusieurs combinaisons de
Afin d'obtenir une compréhension je vous suggère d'écrire les nombres binaires sur le papier et ce qui se passe. En essayant de lire un tutoriel ne pouvons garantir la compréhension. esp s'ils ne l'ont pas aidé à ce jour.
Il est simple mais clair tutoriel que je trouve utile ici
Ce n'est pas vraiment un tutoriel, mais j'ai un bibliothèque de décalage de bits fonctions en Java qui vous êtes les bienvenus à l'étude!
Aussi, si vous faites une recherche google pour "bit-à-bit astuces" vous trouverez beaucoup de matériel. Beaucoup de ces derniers sont en C/C++, mais sont généralement trivialement à se convertir à Java, comme la plupart de la syntaxe est la même.
Voici les les détails de la façon dont le décalage de bits fonctionne.
Il y a certains non-intuitive comportement qui n'est pas couvert par le tutoriel officiel. Par exemple, l'opérande de droite a une portée limitée (de 0 à 31 pour les int, 0-63 pour longtemps), et ne génère pas d'alerte si vous dépassez cette plage -- il vient de tronquer les bits (c'est à dire %32 ou %64), ce qui peut donner un comportement autre que vous attendez.
Ce site semble donner un très bon tutoriel sur ce que vous pouvez faire avec de manipulation de bits (donc, pas spécifique à java, mais depuis, il est assez facile à traduire)
http://www.bogotobogo.com/cplusplus/quiz_bit_manipulation.html
Le tutoriel ci-dessus fournit
Voici un fichier qui a un tas d'implémentations java
http://geekviewpoint.com/
Ce sont deux bons tutoriels que j'ai trouvé lors de l'apprentissage sur le décalage de bits, ils sont en java, mais la plupart des langues utilisent les mêmes opérateurs et la théorie est la même.