Différence entre certains opérateurs "|", "^", "& amp;", "& amp; ^". Golang
Récemment, j'ai lu golang spécification et face à certains intéressant opérateurs:
& bitwise AND integers
| bitwise OR integers
^ bitwise XOR integers
&^ bit clear (AND NOT) integers
J'ai essayé de jouer avec elle, mais le seul que j'ai compris, c'est que "|" ajouter des entiers et l'opérateur "+" en outre travail avec des chars, des chaînes, etc.
Ce qu'ils sont utilisés dans la pratique? Quelqu'un pourrait-il donner quelques explications sur ces 4 opérateurs ci-dessus?
source d'informationauteur Timur Fayzrakhmanov | 2015-02-10
Vous devez vous connecter pour publier un commentaire.
Opérateurs au niveau du bit entrent en jeu lorsque vous avez à travailler avec d'octets ou de bits de données au niveau de.
Ici, je liste quelques exemples utilisant les opérations sur les bits avec des exemples de code (dans aucun ordre particulier):
1. Ils sont communs et une partie de nombreux algorithmes dans cryptographie et fonctions de hachage (par exemple MD5).
2. Ils sont également souvent utilisés si vous voulez "économiser" de l'espace et vous pack de multiples "bool" variables dans un
int
par exemple, vous affectez un peu à chaque variable boolean. Vous devez utiliser des opérateurs au niveau du bit pour être en mesure de changer individuellement/lire les bits.D'emballage par exemple 8 bits/bool dans un
int
:3. Un autre domaine est la compression des données où vous voulez obtenir les la plupart hors de
byte
et d'utiliser tous ses bits pour stocker/récupérer des infos (un bit est l'unité d'information de base en informatique et communications numériques).4. Similaire à la compression, mais pas tout à fait la même: bitstreams. Il est également utilisé pour économiser de l'espace dans un flux de données en n'envoyant pas complète octets, mais plutôt les champs ayant peu arbitraire de longueur.
J'ai écrit et publié un très optimisé au niveau des bits Lecteur et l'Écrivain paquet, open source ici: github.com/icza/bitio. Vous verrez l'utilisation extensive de toutes sortes d'opérations sur les bits dans ses sources.
5. Une autre utilisation pratique: de tester certaines propriétés d'un (entier) nombre. Sachant que la représentation binaire des nombres entiers (En complément à deux) il y a certaines caractéristiques de nombres dans leur représentation binaire. Par exemple un nombre entier (en complément de 2) est même (peut être divisée par 2) si le bit de poids faible est 0:
En testant les bits d'un entier, vous pouvez aussi dire si c'est une puissance de 2. Par exemple, si un nombre positif ne contient qu'un seul
1
peu, puis il est une puissance de 2 (par exemple2 = 0x02 = 00000010b
16 = 0x10 = 00010000
mais par exemple17 = 0x11 = 00010001
pas la puissance de 2).6. Beaucoup de codage/décodage des procédures également utiliser les opérations sur les bits. Le plus trivial est le L'encodage UTF-8 qui utilise une longueur variable de codage pour représenter les points de code unicode (
rune
en Aller) comme les séquences d'octets.Une simple variation d'une variable-length encoding pourrait être d'utiliser la plus grande des bits d'un octet (8e ou 7e si 0-indexé) pour signaler si plus d'octets sont nécessaires pour décoder un nombre, et les 7 autres bits sont toujours les "utile" de données. Vous pouvez tester le bit le plus élevé et de "séparer" les 7 bits utiles comme ceci:
Le bénéfice de l'utilisation d'une telle variable-length encoding est que même si vous utilisez
uint64
type dans le jeu de Go, qui est de 8 octets en mémoire, le petit nombre peut toujours être représenté en utilisant moins d'octets (les numéros de la plage0..127
seulement besoin de 1 octet!). Si les échantillons que vous souhaitez stocker ou transférer un grand nombre de petits les valeurs, cela seul peut compresser les données pour les 1/8e = 12.5 %. L'inconvénient est que les grands nombres (qui ont des bouts, même dans la plus haute octet) va utiliser plus de 8 octets. Si ça vaut le coup dépend de l'heuristique des échantillons.X. Et la liste continue...
Pouvez-vous vivre sans savoir/à l'aide d'opérateurs au niveau du bit en Aller (et dans de nombreux autres langages de programmation)? La réponse est Oui. Mais si vous savez, parfois, ils peuvent rendre votre vie plus facile et vos programmes plus efficaces.
Si vous voulez en savoir plus sur le sujet, lire l'article de Wikipedia: Opération au niveau du bit et google le terme "bit à Bit les Opérateurs Tutoriel", il y a beaucoup de bons articles.
Pour ce qu'ils techniquement le faire vérifier les commentaires de cette
Vue sur l'aire de jeux
Veuillez noter que j'ai donné deux exemples de
|
pour montrer qu'il n'est vraiment plus comme1 + 5
.Que pour des utilisations pratiques, je suis sûr que d'autres pouvaient s'exprimer avec plus d'exemples, mais l'utilisation la plus courante est de créer un masque de bits des drapeaux pour quelque chose comme un système d'autorisation.