Les langages de programmation viennent souvent avec différents opérateurs de bits (par exemple décalage gauche et droite au niveau du bit, AND au niveau du bit, OR, XOR ...). Celles-ci ne sont cependant pas très utilisées, ou du moins telle a été mon expérience. Ils sont parfois utilisés dans des défis de programmation ou des questions d'entrevue, ou la solution pourrait les nécessiter, par exemple:
- Sans utiliser d'opérateur d'égalité, créez une fonction qui renvoie
true
lorsque deux valeurs sont égales - Sans utiliser une troisième variable, permutez la valeur de deux variables
Ceux-ci, encore une fois, ont probablement peu d'utilisations réelles . Je suppose qu'ils devraient être plus rapides car ils manipulent directement la mémoire à un faible niveau.
Pourquoi en trouve-t-on dans la plupart des langages de programmation? Des cas d'utilisation réels?
return !(x-y);
:? Je ne sais pasRéponses:
Non, ils ont de nombreuses applications réelles et sont des opérations fondamentales sur les ordinateurs.
Ils sont utilisés pour
En fait, logiquement, toutes les opérations sur un ordinateur se résument finalement à des combinaisons de ces opérations au niveau du bit de bas niveau, qui ont lieu dans les portes électriques du processeur.
la source
Parce que ce sont des opérations fondamentales.
Par la même ligne de pensée, vous pourriez faire valoir que l' addition a peu d'utilisations réelles, car elle peut être remplacée complètement par la soustraction (et la négation) et la multiplication. Mais nous gardons l'addition car c'est une opération fondamentale.
Et ne pensez pas un instant que le simple fait que vous n'ayez pas vu un grand besoin d'opérations au niveau du bit ne signifie pas qu'elles ne sont pas utilisées très souvent. En effet, j'ai utilisé des opérations au niveau du bit dans presque tous les langages que j'ai utilisés pour des choses comme le masquage de bits.
Du haut de ma tête, j'ai utilisé des opérations au niveau du bit pour le traitement d'image, les champs de bits et les indicateurs, le traitement de texte (par exemple, tous les caractères d'une classe particulière partagent souvent un modèle de bits commun), l'encodage et le décodage de données sérialisées, le décodage de VM ou CPU opcodes, etc. Sans opérations au niveau du bit, la plupart de ces tâches nécessiteraient des opérations beaucoup plus complexes pour effectuer la tâche de manière moins fiable ou avec une meilleure lisibilité.
Par exemple:
Le décodage des instructions CPU pour les CPU de type RISC (comme lors de l'émulation d'une autre plate-forme) nécessite d'extraire des parties d'une grande valeur comme ci-dessus. Parfois, effectuer ces opérations avec multiplication et division et modulo, etc., peut être jusqu'à dix fois plus lent que les opérations binaires équivalentes.
la source
Un exemple typique consiste à extraire les couleurs individuelles d'une valeur RVB 24 bits et inversement.
MODIFIER: depuis http://www.docjar.com/html/api/java/awt/Color.java.html
la source
Voici un exemple du monde réel que vous trouverez dans Quake 3, Quake 4. Doom III. Tous ces jeux qui utilisaient le moteur Q3 .
(Pour comprendre ce code, vous devez comprendre comment les nombres à virgule flottante sont stockés, je ne peux certainement pas développer cela)
En termes d'utilisation, à moins que vous ne soyez dans des domaines qui nécessitent un décalage de bits tels que la mise en réseau ou les graphiques, vous pouvez trouver leur objectif légèrement académique. Mais toujours intéressant (du moins pour moi).
la source
Le décalage est plus rapide que la multiplication ou la division par une puissance de deux. Par exemple, a << = 2 multiplie a par 4. A l'inverse, a >> = 2 divise a par quatre. On peut également bit-bang des données vers un périphérique en utilisant les opérateurs bit par bit. Par exemple, nous pouvons envoyer N flux de données série à partir d'un port N broches en utilisant les opérations shift, xor et "and" à l'intérieur de N boucles. Tout ce qui peut être accompli en logique numérique peut également être accompli sur le logiciel et vice versa.
la source
Il y a très longtemps, les opérateurs de bits étaient utiles. Aujourd'hui, ils le sont moins. Oh, ils ne sont pas entièrement inutiles, mais cela fait longtemps que je n'en ai pas vu un qui aurait dû être utilisé.
En 1977, j'étais programmeur en langage assembleur. J'étais convaincu que l'assembleur était la seule vraie langue. Je suis certain que la langue comme Pascal étaient pour weenies universitaires qui n'a jamais eu à faire quoi que ce soit vrai fait.
J'ai ensuite lu "The C Programming Language" de Kernighan et Ritchie. Cela a complètement changé d'avis. La raison? Il y avait des opérateurs peu! Il était un langage d'assemblage! Il avait juste une syntaxe différente.
À l'époque, je ne pouvais pas imaginer écrire du code sans ands, ors, shifts et rotates. De nos jours, je ne les utilise presque jamais.
Donc, la réponse courte à votre question est: "Rien". Mais ce n'est pas tout à fait juste. Donc, la réponse la plus longue est: "Surtout rien."
la source
Chiffrement
Je suggère de jeter un coup d'œil à un très petit extrait de l' algorithme de cryptage DES :
la source
Beaucoup de bonnes réponses, donc je ne répéterai pas ces utilisations.
Je les utilise beaucoup dans le code managé (C # / .Net), et cela n'a rien à voir avec des algorithmes d'économie d'espace, de hautes performances ou de décalage de bits intelligent. Parfois, une logique est tout simplement bien adaptée au stockage de données de cette manière. Je les utilise souvent lorsque j'ai une énumération, mais les instances peuvent simultanément prendre plusieurs valeurs de cette énumération. Je ne peux pas poster un exemple de code de travail, mais un rapide google pour "Flags enum" ("Flags" est la manière C # de définir une énumération à utiliser au niveau du bit) donne ce bel exemple: http: // www.dotnetperls.com/enum-flags .
la source
Il y a aussi le calcul parallèle en bits. Si vos données ne sont que 1 et 0, vous pouvez en regrouper 64 dans un mot long non signé et obtenir des opérations parallèles 64 voies. Les informations génétiques sont sur deux bits (représentant le codage AGCT de l'ADN), et si vous pouvez effectuer les différents calculs de façon parallèle, vous pouvez faire beaucoup plus que si vous ne le faites pas. Sans parler de la densité des données en mémoire - si la mémoire, ou la capacité du disque, ou la bande passante des communications est limitée implique que la compression / décompression doit être envisagée. Même les entiers à faible précision, qui apparaissent dans des domaines tels que le traitement d'image, peuvent tirer parti du calcul parallèle délicat. C'est tout un art en soi.
la source
Pourquoi les trouve-t-on?
Eh bien, c'est probablement parce qu'ils correspondent aux instructions de montage et parfois ils sont juste utiles pour des choses dans des langages de niveau supérieur. La même chose s'applique au redouté
GOTO
qui correspond à l'JMP
instruction d'assemblage.Quelles sont leurs utilisations?
Vraiment, il y a trop d'utilisations à nommer, je vais donc donner un usage récent, bien que très localisé. Je travaille beaucoup avec l'assemblage 6502 et je travaillais sur une petite application qui convertit les adresses de mémoire, les valeurs, compare les valeurs, etc. en codes qui peuvent être utilisés pour l'appareil GameGenie (Fondamentalement, une application de triche pour la NES). Les codes sont créés par une manipulation de bits.
la source
De nos jours, de nombreux programmeurs sont habitués aux ordinateurs avec une mémoire quasi infinie.
Mais certains utilisent toujours de minuscules microcontrôleurs où chaque bit compte (lorsque vous n'avez que 1 Ko ou moins de RAM par exemple), et les opérateurs au niveau du bit permettent à un programmeur d'utiliser ces bits un à la fois au lieu de gaspiller une programmation beaucoup plus grande entité d'abstraction qui pourrait être nécessaire pour conserver un état requis par l'algorithme. L'E / S sur ces appareils peut également nécessiter une lecture ou un contrôle au niveau du bit.
Le «monde réel» possède bien plus de ces minuscules microcontrôleurs que des serveurs ou des PC.
Pour les types CS théoriques purs, les machines Turing sont toutes des bits d'état.
la source
Encore une des nombreuses utilisations possibles des opérateurs au niveau du bit ...
Les opérateurs au niveau du bit peuvent également aider à rendre votre code plus lisible. Considérez la déclaration de fonction suivante ....
Il est très facile d'oublier quel paramètre booléen signifie quoi lors de l'écriture ou même de la lecture du code. Il est également facile de perdre la trace de votre comptage. Une telle routine peut être nettoyée.
Avec des noms d'indicateur plus descriptifs, il devient beaucoup plus lisible.
la source
Si vous savez quelque chose sur Unicode , vous connaissez probablement UTF-8. Il utilise un tas de tests de bits, de décalages et de masques pour compresser le point de code de 20 bits en 1 à 4 octets.
la source
Je ne les utilise pas souvent mais parfois ils sont utiles. La manipulation de l'énum vient à l'esprit.
Exemple:
la source
Je ne sais pas si cette utilisation a encore été notée:
Je vois OU beaucoup lorsque je travaille avec le code source illumos (openSolaris) pour réduire plusieurs valeurs de retour à 0 ou 1, par exemple
la source