Bitset c++(11) avec opérations arithmetiques : addition, soustraction, multiplication, division, modulo + divers outils

Soyez le premier à donner votre avis sur cette source.

Vue 7 639 fois - Téléchargée 492 fois

Description

Mabit : Arithmétique multi-précision sur des entiers.

L'objectif de cette classe est de permettre la manipulation d'entiers en précision arbitraire avec la même aisance que des entiers primitifs.

Elle supporte tous les opérateurs arithmétiques, binaires, logiques, et de comparaison.

Des fonctionnalités comme l'insertion de flux (depuis un fichier ouvert avec std::ifstream (opérateur << )) et d'extraction de flux (vers un ostream valide) y sont présentes afin de faciliter le chargement de tout type de fichier en mémoire.

Les représentations en binaire, octal, décimal et hexadécimal sont supportés (via l'utilisation des modifieurs std::hex|dec|oct sur un flux).

Les performances ont été grandement améliorées depuis la précédente version. Il n'est plus nécessaire de spécifier la taille du champs de bit en argument template à l'instanciation, comme il le fut dans les versions précédentes de ce code.

Il est fait l'utilisation de fonctionnalités de C++11, un compilateur adéquat sera donc nécessaire (>= gcc4.6). Le makefile joint utilise gcc4.8 qui est maintenant tout simplement le compilateur intégrant complètement la norme C++11 (depuis sa version 4.8.1). Il sera peut-être nécessaire de modifier cette ligne pour adapter à la version que vous utilisez.

Conclusion :


Les opérations standards sont bien supportées.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Ah le mersenne_twister !! effectivement je referai une passe. Merci pour les static, je voyais bien le côté fourre-tout dérangeant mais j'ai besoin d'accéder à du private de mabit depuis ces fonctions statiques .. Sinon chrono malheureusement nécessite une recompilation de gcc chez moi pour fonctionner, ce que j'ai fait, mais ca pourrait être gênant pour ceux qui voudraient tester rapidement la source par ici... A la limite je ferai une horloge monotonique que je mettrai avec le projet.

Le .cpp a changé en cxx mais je me suis trompé d'archive à uploader xD

Je connaissais pas ces subtilités avec le typeid, merci beaucoup !

A bientôt
Messages postés
3840
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 février 2021
119
Suite à la maj du 26 juin 2013 13:39:33 :
C'est propre et bien écrit.

J'ai quelques remarques (très) mineures:
- Évite les using namespace.
- Tout code templaté, doit être mis dans un .hpp et non dans un .cpp (risque de ne pas fonctionner, souci de "linkage" possible). Utilise la technique de .cpp/.hpp/.hxx qui te permet de séparer code, code templaté et en-tête. Cf mes sources pour l'utilisation de cette technique.
- Plutôt que de créer une classe dont tous les membres sont statiques, il est préférable d'avoir des fonctions dans un namespace (remplacer "class" par "namespace" et retirer les "static" dans "mabit_stream.hpp")
- À la place de rand() et srand(), vu que tu fais du C++, tu peux avantageusement les remplacer par un "mersenne_twister" (classe de vrai random C++11). Cf: https://github.com/cptpingu/game/blob/master/src/Core/Random.cc
- Pour calculer des temps de réponse en C++11 utilise "std::chrono", plutôt que du "difftime"
- typeid.name() n'est pas fiable. Tu l'utilises pour un affichage cosmétique, ce qui n'est pas gênant (c'est fait pour :p). Mais il faut savoir que pour comparer deux typeid, on ne doit pas se baser sur name() qui change d'une implémentation à une autre, mais bien "==" qui est garantie. (La précision était un peu HS, mais importante).

Bonne continuation.
Bonjour CptPingu,

merci pour ces remarques, j'en tiens compte et posterai le tout modifié,
pour l'heure je viens de trouver un bug dans la multiplication objet-objet, je corrige ça aussi et ça ressemblera enfin à quelque chose.

En ce qui concerne le "this->" pour appeller un attribut ou méthode, disons que c'est une norme que je me suis imposé, ça me facilite la relecture.

Ce code est en fait écrit dans un .hpp, mais n'ayant pas joint de zip ça porte à confusion.. je reviens avec un projet complet et compilable :)
Messages postés
3840
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 février 2021
119
Bonjour.

Au niveau du code, pas grand chose à redire, c'est propre, et tu as fait l'effort de commenter.

Quelques remarques, très mineures:
- Pas besoin de "this->" pour appeler un attribut ou une méthode.
- Évite de mettre du code dans un header. Utilise soit un .hh/.cc (ou .hpp/.cpp), ou alors inclus ton code dans un fichier de "code header" (.hxx). Cf mes sources.
- Le code est commenté, mais au format doxygen, ça aurait été un poil mieux (voir la dernière section de: http://0217021.free.fr/portfolio/axel.berardino/articles/ecrire-de-bons-commentaires)
- Pour la méthode "to_string", pour le: "là je sèche, je ne vois pas comment faire sans utiliser de calculs" ce n'est pas très dur. Tu as forcément la valeur, donc tu peux le faire passer dans un std::ostringstream et utiliser celui-ci pour créer la représentation (à coup de std::hex, std::dec, std::oct, etc...).

Sinon, ça aurait été un grand plus, que tu joignes un code complet compilable, avec des exemples commentés d'utilisation de ta classe (un main avec plein d'exemples commentés par exemple).

(J'ai écris plus de critiques qu'autre chose, mais n'en déduis pas que ce que tu as fait n'est pas bien. C'est au contraire propre sur le fond et la forme).

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.