Question

Avez-vous déjà eu à utiliser décalage de bits dans des projets de programmation réels? La plupart (sinon tous) langages de haut niveau ont des opérateurs de décalage en eux, mais quand voulez-vous réellement besoin de les utiliser?

Était-ce utile?

La solution

Je vous écris du code encore pour les systèmes qui ne supportent pas de virgule flottante dans le matériel. Dans ces systèmes, vous avez besoin de changement de bit pour presque tous vos calculs.

Aussi, vous avez besoin pour générer des changements hash. arithmétique polynomiale (CRC, codes Reed-Solomon sont les applications grand public) ou utilise des changements aussi bien.

Cependant, les changements sont simplement utilisés parce qu'ils sont à portée de main et d'exprimer exactement ce que l'écrivain prévu. Vous pouvez émuler tous les bits décalages avec la multiplication si vous voulez, mais ce serait plus difficile à écrire, moins lisible et parfois plus lent.

Les compilateurs détectent les cas où la multiplication peut être réduit à un quart de travail.

Autres conseils

Oui, je les ai utilisé beaucoup de fois. Bit bidouilles est important sur le matériel embarqué où des masques-bit sont très fréquents. Il est également important dans la programmation de jeux, lorsque vous avez besoin chaque bit de la performance.

Edit:. En outre, je les utilise beaucoup pour la manipulation de bitmaps, par exemple en changeant la profondeur de couleur, ou la conversion RVB <-> BGR

  • Créer des belles de drapeau pour les énumérations (au lieu de taper manuellement 1, 2, 4 ...)
  • Déballer les données des champs de bits (de nombreux protocoles réseau les utilisent)
  • traversal Z-courbe
  • hacks de performance

Et je ne peux pas penser à de nombreux cas, quand ils sont utilisés. Il est généralement inverse - il y a un problème spécifique, et il se avère que l'utilisation des opérations de bits donnera les meilleurs résultats (généralement en terme de performance - temps et / ou dans l'espace).

Un endroit que je les utilise tout le temps est la transposition de la endian-ness des entiers pour les applications multi-plateformes. Ils viennent aussi parfois à portée de main (ainsi que d'autres opérateurs de manipulation de bits) lorsque blitting graphiques 2D.

Je les ai utilisé quelques fois, mais à peu près toujours pour l'analyse d'un format de fichier binaire.

décalages de bits sont rapides. Ils ont été mis en œuvre dans l'instruction CPU définit bien avant les opérations de division et module étaient. Beaucoup d'entre nous ont utilisé décalages de bits pour l'arithmétique qui est simple sur le crayon et le papier, mais pas disponible sur nos processeurs.

Par exemple:

  • Je l'ai utilisé décalages de bits pour les projets impliquant factorisation de grands composites dans leurs facteurs premiers.
  • Je l'ai aussi utilisé décalages de bits pour trouver la racine carrée et cube de entiers arbitrairement grands.

Oui, encore il est nécessaire.

Ici, dans mon travail par exemple, nous développons des logiciels pour comunication avec PLC via le port série COMx. Il est nécessaire de traiter les bits dans un octet, nous utilisons décalage à gauche / droite, et les opérateurs logiques OU, XOR, et jour par jour.

Par exemple, supposons que nous avons besoin d'activer le bit 3 (droite à gauche) d'un octet:

Il est beaucoup plus efficace de le faire:

Byte B;

B := B XOR 4;

Au lieu de:

Byte B = 0;
String s;  // 0 based index

s = ConvertToBinary (B);
s[5] = "1";
B := ConvertToDecimal (s);

Cordialement.

Quand je l'ai écrit en langage assembleur, mon code était plein de bits déplacement et le masquage.

est-elle apparue une bonne quantité en C, ainsi.

Je n'ai pas fait beaucoup en JavaScript ou langages serveur.

Probablement le meilleur usage moderne est à l'étape par un tableau rempli de valeurs booléennes représentées comme des zéros et les. Je l'habitude de toujours laissé quart de travail et vérifier bit de signe dans l'assemblage, mais dans les langues de niveau supérieur vous compare à une valeur.

Par exemple, si vous avez 8 bits, vous vérifiez le bit supérieur avec "if (a> 127) {...}". Ensuite, vous avez quitté décalage (ou multiplier par 2), faire une « et » avec 127 (ou faire une soustraction de 256 si le dernier bit a été défini), et de le faire à nouveau.

je les utilise beaucoup dans l'image de compression / décompression, où les bits d'un bitmap ont été compressés. En utilisant http://en.wikipedia.org/wiki/Huffman_coding les choses se composent de comprimé différents nombres de bits (ils ne sont pas tous alignés octet), et donc vous devez les décaler peu lorsque vous encodez ou les décoder.

Par exemple, la mise en œuvre des méthodes de chiffrement sur des langages tels que C, C ++. Les fichiers binaires, les algorithmes de compression et des opérations de listes logiques - opération est toujours bon bit =)

décalage de bits ne résout pas les problèmes de programmation de haut niveau, mais juste nous avons parfois de résoudre des problèmes de niveau inférieur, et il est commode de ne pas avoir à écrire une bibliothèque séparée en C pour le faire. C'est quand il est utilisé le plus est ma conjecture.

Je l'ai personnellement utilisé par écrit un codeur pour un EBCDIC convertisseur de jeu de caractères.

Oui, je l'ai. Comme vous pouvez l'imaginer, il est le plus susceptible de se trouver dans la programmation de bas niveau, par exemple le développement des pilotes de périphériques. Mais, je travaillais sur un projet C # où je devais développer un service Web qui a reçu des données de dispositifs médicaux. Toutes les données binaires stockées dispositif a été codé en paquets de savon, mais les données binaires a été compressées et codées. Donc, pour le décomprimer, vous devez faire beaucoup et beaucoup de manipulations de bits. Et vous devez en outre faire beaucoup de décalage de bits pour analyser toute information utile, par exemple le numéro de série est dispositif une moitié inférieure du second octet ou quelque chose comme ça. Aussi j'ai vu certaines personnes dans .NET (C #) dans le monde font une utilisation de masquage de bits et d'attributs Drapeau, j'avais personnellement jamais envie de le faire.

yep. Je dois écrire des algorithmes de chiffrement avant et qui utilise certainement eux.

Ils sont également utiles lors de l'utilisation des nombres entiers, etc pour garder la trace des statuts.

Lors de la conversion des nombres de little endian au grand format endian et vice versa

Je travaille pour un fabricant de périphériques informatiques. Je l'ai rencontré, et a dû mettre en œuvre le code qui utilise des changements de bits, à peu près tous les jours.

transformée de Fourier rapide - FFT et il est technique Cooley-Tukey nécessite peu d'utilisation des opérations de décalage.

Trouver le plus proche puissance de deux supérieure ou égale à nombre donné:

1 << (int)(ceil(log2(given)))

Nécessaire pour texturation sur le matériel qui ne supporte pas la taille des textures arbitraires.

décalage de bits est beaucoup utilisé à déchiffrer les protocoles de jeux en ligne. Les protocoles sont conçus possible d'utiliser un peu de bande passante, donc au lieu de transmettre le nombre de joueurs sur un serveur, les noms et ainsi de suite à INT32, toutes les informations sont emballés en tant que quelques octets possible. Il est ces jours-ci pas vraiment nécessaire avec la plupart des personnes qui utilisent le haut débit, mais quand ils ont été conçus à l'origine utilisé les modems 56k pour les jeux, donc chaque bit compté.

Les exemples les plus frappants de ce sont les jeux multijoueurs de Valve notamment Counter-Strike, Counter-Strike Source. Le protocole Quake3 est aussi le même, mais Unreal est pas tout à fait Slimline.

Voici un exemple (.NET 1.1)

string data = Encoding.Default.GetString(receive);

if ( data != "" )
{
    // If first byte is 254 then we have multiple packets
    if ( (byte) data[0] == 254 )
    {
        // High order contains count, low order index
        packetCount = ((byte) data[8]) & 15; // indexed from 0
        packetIndex = ((byte) data[8]) >> 4;
        packetCount -= 1;

        packets[packetIndex] = data.Remove(0,9);
    }
    else
    {
        packets[0] = data;

    }
}

Bien sûr que vous considérer cela comme un vrai projet ou tout simplement un passe-temps (en C #) est à vous.

Oui, les a utilisés dans l'analyseur de flux MPEG2-2 Transport. Il était plus facile et était plus lisible.

Je devais écrire un programme pour analyser les fichiers .IFO sur les disques DVD. Ce sont les fileds qui expliquent combien de titres, chapitres, menus, etc. sont sur le disque. Ils sont constitués de bits emballés de toutes tailles et alignements. Je soupçonne que de nombreux formats binaires nécessitent un décalage de bits similaire.

Je l'ai vu les opérateurs utilisés lorsque plusieurs bitwise drapeaux ont été utilisés en tant que paramètre de propriété. Par exemple numéro 4 = 1 0 0 signifie que l'un des trois drapeaux est activé. Ce n'est pas bon pour l'API publique, mais il peut accélérer les choses dans des cas particuliers depuis la vérification des bits est rapide.

Chaque BitBlt-er i jamais écrit ne aurait pu être terminé w / o capacité à faire glisser les bits gauche et à droite.

Je les ai utilisé sur les jeux pour emballer un tas de drapeaux dans un seul octet / char pour sauver sur une carte de données. Des choses comme stocker l'état de déblocables etc. pas tant d'une exigence de nos jours, mais peut enregistrer le travail.

Je l'utilise dans un projet pour un système embarqué qui doit lire les données EDID d'un moniteur. Certaines données dans un EDID est codé comme ceci:

Octet # 3:
Suppression horizontale - 8 bits inférieurs
Octet # 4:
Basse Grignoter: suppression horizontale - 4 bits supérieurs
Haute-Grignoter: autre chose

Oui, lorsque vous effectuez une communication binaire entre Java et les applications C #, l'un est l'ordre des octets big-endian et l'autre est petit-boutiste (pas nécessairement sur cet ordre). J'ai créé une classe InputStream qui pourrait lire des chiffres avec un autre ordre des octets, et utilisé-décalage d'octets pour travailler.

Parfois aussi quand vous voulez mettre 4 short dans les 4 octets d'une longue, ce serait le cas où le déplacement de l'utilisation d'octets. Je pense que je l'ai fait il y a plusieurs années ...

Une autre chose très commune est de faire un changement de 4 bits lors de l'extraction du haut de grignotage un octet, à savoir

#define HIGH_NIBBLE(byte) (((byte) >> 4) & 0x0F)
#define LOW_NIBBLE(byte)  ( (byte)       & 0x0F)

décalage de bits est également nécessaire lors des communications avec un équipement « inférieur de niveau », ethernet-IO numérique eq -boxes ou PLC, qui emballer généralement des valeurs d'entrée / sortie individuels en octets.

Oui, un décalage de bits est utilisé au logiciel embarqué bas niveau tout le temps. Il peut également être utilisé comme un truc presque magique pour effectuer des opérations mathématiques extrêmement rapide, jetez un oeil à

http://betterexplained.com/articles/understanding- -tremblements de terre-carré inverse-rapide racine /

Oui, tout le temps. Comme ces macros pour l'emballage et le déballage d'une 3SPACE coordonnée à / d'un entier de 32 bits:

#define Top_Code(a, b, c)           ((((a) + x) << 20) | (((b) + y) << 10) | ((c) + z))                           
#define From_Top_Code(a, b, c, f)   (a = (((f) >>> 20) - x), b = ((((f) & 0xffc00) >>> 10) - y), c = (((f) & 0x3ff) - z))        
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top