8
votes

Les opérations bitwises sont-elles toujours pratiques?

Wikipedia, la seule source de connaissances, états:

sur la plupart des microprocesseurs plus anciens, du bitpewise Les opérations sont légèrement plus rapides que Opérations d'addition et de soustraction et généralement significativement plus rapide que Multiplication et division Opérations. Sur les architectures modernes, Ce n'est pas le cas: Bitwise Les opérations sont généralement les mêmes vitesse comme ajout (bien que toujours plus rapide que la multiplication).

Y a-t-il une raison pratique d'apprendre des hacks d'opération binaire ou il est maintenant juste quelque chose que vous apprenez pour la théorie et la curiosité?


5 commentaires

Wikipedia "vraie source de connaissances"? Cela semble un peu exagéré ...


@Shintakezzou: C'est ce qu'on appelle le sarcasme.


Je ne peux pas obtenir des indices sur le fait que c'est sarcasme, sauf que je pense que la réclamation est exagérée et que je sais que les personnes qui pensent que Wikipedia est vraiment une grande source de connaissances et qu'elle a toujours raison, et puisque je ne peux pas Je connais l'opinion réelle de l'OP et POV à ce sujet, je dois prendre la réclamation au sérieux. Heureux de savoir que c'est sarcasme.


Dans ce cas, notre seule source de connaissances est même parfaitement correcte pour les processeurs modernes. Voir ici pour les tableaux d'instruction d'Intel. Le débit réciproque pour ADD / SUB et / ou / / XOR est assez identique;)


Comment osez-vous déshonorer le nom de la Fondation Wikimedia! pour un GNU Dawn!


9 Réponses :


5
votes

Ils sont utiles pour comprendre comment "fonctionne" binaire; Sinon, non. En fait, je dirais que même si les hacks Bitwise sont plus rapides sur une architecture donnée, c'est le travail du compilateur à utiliser ce fait - pas le vôtre. Écrivez ce que tu veux dire.


4 commentaires

+1 pour "c'est le travail du compilateur." Cela dit, parfois ce que vous voulez dire, c'est de | Ensemble un tas de masques de bits, puis et le résultat avec une valeur pour voir si divers drapeaux sont définis.


@Serm: Bien sûr - mais vous ne voulez pas "dire" addition ou soustraction, les opérations bitwises sont donc sémantiquement correctes (et encore, c'est le travail du compilateur de comprendre le meilleur moyen de le faire).


Le code n'est pas toujours compilé, en fonction de la plate-forme et de la langue, de sorte que la performance est toujours une préoccupation, les opérations biteux peuvent être utiles à connaître et à utiliser


Je ne le mettrais pas au-delà des interprètes modernes pour optimiser quelques astuces de bits triviaux - et même si non. Les boucles mathématiques serrées sont rarement exécutées sur des langues interprétées - le résultat ne sera pas particulièrement important (facteur 50+ ou quoi entre une implémentation numpée et régulière de Python?)



0
votes

Bien sûr (à moi) La réponse est oui: il peut y avoir des raisons pratiques de les apprendre. Le fait que de nos jours, par exemple un ajoutez instruction sur les processeurs typiques est aussi rapide qu'un ou / xor ou Un et signifie simplement que: un Ajouter est aussi rapide que, disons, un ou sur ces processeurs . < / p>

Les améliorations de la rapidité des instructions telles que l'ajout, la division, etc. signifie que maintenant sur ces processeurs vous pouvez les utiliser et être moins inquiet pour l'impact de la performance; Mais cela est vrai maintenant comme dans le passé que vous ne modifiez généralement pas chaque ajouter s vers les opérations bitwises pour implémenter un ajouter . C'est-à-dire que, dans certains cas, il peut dépendre des hacks: probablement, certains hack doivent maintenant être considérés comme éducatifs et non pratiques; d'autres pourraient encore avoir leur application pratique.


0 commentaires

1
votes

Le seul cas où il est logique de les utiliser est si vous utilisez réellement vos numéros en tant que bitvecteurs. Par exemple, si vous modélisez une sorte de matériel et que les variables représentent des registres.

Si vous voulez effectuer des arithmétiques, utilisez les opérateurs arithmétiques.


0 commentaires

1
votes

dépend de votre problème. Si vous contrôlez du matériel, vous avez besoin de façons de définir des bits simples dans un entier.

Achetez une carte PCI OGD1 (carte graphique ouverte) et parlez-y à l'aide de libpci. http://fr.wikipedia.org/wiki/open_graphics_project


0 commentaires

12
votes

Les opérations bitwiswwise sont toujours utiles. Par exemple, ils peuvent être utilisés pour créer des "indicateurs" à l'aide d'une seule variable et économiser sur le nombre de variables que vous utiliseriez pour indiquer diverses conditions. En ce qui concerne la performance sur les opérations arithmétiques, il est préférable de laisser le compilateur faire l'optimisation (sauf si vous êtes une sorte de gourou).


3 commentaires

Ceci est indispensable pour des trucs comme des protocoles ou de la configuration matérielle ainsi qu'une source potentielle d'améliorations de performances beaucoup plus grandes que les comptes de cycle de fonctionnement impliqueraient car elle peut réduire considérablement les exigences de la bande passante de la mémoire d'un code.


"Il vaut mieux laisser le compilateur faire l'optimisation (sauf si vous êtes une sorte de gourou)" - ou écrivez le compilateur, ou de travailler avec un compilateur de merde ... Apprendre que tous les hacks peuvent ne pas être essentiels, mais apprendre à utiliser Les opérations binaire doivent être considérées comme importantes que d'apprendre à utiliser «+» et «,» correctement.


@James pas sûr de cela. Comme un poste précédent ici (tristement supprimé maintenant) a montré que c'est juste trop facile pour obtenir ce truc. En outre, BitStuff est principalement utile en optimisation des performances pour des trucs lourds qui devraient être dans une belle bibliothèque. Pour les optimisations de l'espace (et il y a quelques pièges dans ce que vous pouvez utiliser des champs de bit qui cachent de nouveau ce type à nouveau. Donc, fondamentalement, vous n'avez besoin que de faire cela pour écrire un protocole de bas niveau, car c laisse à nouveau l'ordre des champs de bit non définis ..



1
votes

Il est vrai que, dans la plupart des cas, lorsque vous multipliez un entier par une constante qui se trouve être une puissance de deux, le compilateur l'optimise d'utiliser le décalage bit. Cependant, lorsque le changement de vitesse est également une variable, le compilateur ne peut pas le déduire, à moins que vous n'utilisez explicitement l'opération de décalage.


1 commentaires

Vrai. D'autre part, certains processeurs se multiplient plus rapidement qu'ils ne peuvent effectuer un changement par une quantité variable de bits. Juste écrire ce qui est lisible. Les chances sont que les 10% critiques de votre code sont quelque part ailleurs de toute façon ...



16
votes

Les opérations bitwises méritent d'être étudiées car elles ont de nombreuses applications. Il est pas leur utilisation principale pour substituer des opérations arithmétiques. La cryptographie, les graphiques informatiques, les fonctions de hachage, les algorithmes de compression et les protocoles de réseau ne sont que quelques exemples dans lesquels des opérations bitwises sont extrêmement utiles.

Les lignes que vous avez citées à partir de l'article Wikipedia vient d'essayer de donner des indices sur la vitesse d'opérations bitwises. Malheureusement, l'article ne donne pas de bons exemples d'applications.


0 commentaires

0
votes

Utilisation des adresses IPv4 nécessite souvent des opérations bit-bits pour découvrir si l'adresse d'un homologue est dans un réseau routable ou doit être transmise sur une passerelle ou si le pair fait partie d'un réseau autorisé ou refusé par des règles de pare-feu. Les opérations de bits sont nécessaires pour découvrir l'adresse de diffusion d'un réseau.

Travailler avec les adresses IPv6 nécessite les mêmes opérations de niveau de bits fondamentales, mais parce qu'elles sont si longues, je ne sais pas comment ils sont mis en œuvre. Je mierais de l'argent qu'ils sont toujours implémentés à l'aide des opérateurs de bits sur pièces des données, dimensionné de manière appropriée pour l'architecture.


0 commentaires

1
votes

Drôle Personne ne vit à mentionner le tableau C / C ++ - également implémenté en Java. Ce concept est extrêmement utile dans le traitement des langues, en particulier lors de l'utilisation de différents alphabets ou lors de l'analyse d'une phrase.

CTYPE [] est un éventail de 256 entiers courts et dans chaque entier, il existe des bits représentant différents types de caractères. Par exemple, CTTPE [; A '] - CTYPE [' Z '] a des bits pour montrer qu'ils sont des lettres majuscules de l'alphabet; CTYPE ['0'] - CTYPE ['9'] Demandez aux bits pour montrer qu'ils sont numériques. Pour voir si un personnage x est alphanumérique, vous pouvez écrire quelque chose comme 'si (CTYPE [x] & (UC | LC | NUM))' qui est quelque peu plus rapide et beaucoup plus élégant que d'écrire 'si (' a '= x < = 'Z' || .... '.

Une fois que vous avez commencé à penser à Bitwise, vous trouvez de nombreux endroits pour l'utiliser. Par exemple, j'ai eu deux tampons de texte. Je l'ai écrit l'un à l'autre, remplaçant toutes les occurrences de retranststring avec remplacement, comme je suis allé. Ensuite, pour la prochaine paire de résultats de remplacement, j'ai simplement commuté les indices de tampon, alors j'écris toujours de la mémoire tampon [en] à la mémoire tampon [OUT]. 'in' a commencé comme 0, "Out" comme 1. Après avoir terminé une copie, j'ai simplement écrit "en ^ = 1; sur ^ = 1; '. Et après avoir manipulé tous les remplaçants, je viens d'écrire un tampon [Out] sur le disque, sans avoir à savoir ce que "Out" était à cette époque.

Si vous pensez que cela est de faible niveau, considérez que certaines erreurs mentales telles que DEJA-VU et ses Twin Jamais-Vu sont causées par des erreurs de bits cérébraux!


0 commentaires