J'utilise Bitset et pour améliorer la performance de mon code, je veux le modifier en bitset dynamique, mais après avoir lu des postes liés à cela, je ne connais toujours pas le moyen de définir mon code.
Alors J'ai attaché mon code et j'aimerais savoir si l'un de vous pourrait m'aider à me donner des idées sur ce que dois-je modifier et comment. P>
Merci d'avance :) P>
// Program that converts a number from decimal to binary and show the positions // where the bit of the number in binary contains 1 #include <bitset> #include <iostream> #include <string> #include <vector> using namespace std; int main() { unsigned long long int dec; bitset<5000> binaryNumber; bitset<5000> mask; mask = 0x1; cout << "Write a number in decimal: "; cin >> dec; // Conversion from decimal to binary int x; for (x = 0; x < binaryNumber.size(); x++) { binaryNumber[x] = dec % 2; dec = dec / 2; } cout << "The number " << dec << " in binary is: "; for (x = (binaryNumber.size() - 1); x >= 0; x--) { cout << binaryNumber[x]; } cout << endl; // Storage of the position with 1 values vector<int> valueTrue; for (int r = 0; r < binaryNumber.size(); r++) // { if (binaryNumber.test(r) & mask.test(r)) // if both of them are bit "1" // we store in valueTrue vector { valueTrue.push_back(r); } mask = mask << 1; } int z; cout << "Bit 1 are in position: "; for (z = 0; z < valueTrue.size(); z++) { cout << valueTrue.at(z) << " "; } cout << endl; system("pause"); return 0; }
6 Réponses :
essayer d'utiliser boost 's dynamic_bitset . p>
Yeap! C'est ce que j'ai regardé, mais même avec les exemples, je ne vois pas la façon de le faire dans mon code ... pourriez-vous m'aider s'il vous plaît? Merci d'avance!
@THOMAS: La documentation est assez détaillée. Avez-vous un problème spécifique?
Le moyen le plus simple d'avoir un bitset dynamique est d'utiliser un;) http://www.boost.org/doc/libs/1_36_0 /Libs/dynamic_bitset/dynamic_bitset.html
Mise à jour: Fournir un exemple complet P>
#include<iostream> #include <boost/dynamic_bitset.hpp> int main() { unsigned long long dec; std::cout << "Write a number in decimal: "; std::cin >> dec; boost::dynamic_bitset<> bs(64, dec); std::cout << bs << std::endl; for(size_t i = 0; i < 64; i++){ if(bs[i]) std::cout << "Position " << i << " is 1" << std::endl; } //system("pause"); return 0; }
Yeap! C'est ce que j'ai regardé, même le même lien, mais même avec les exemples, je ne vois pas la façon de le faire dans mon code ... pourriez-vous m'aider s'il vous plaît? Merci d'avance!
Voici. J'espère que j'ai compris ce que tu voulais. J'ai utilisé 64 en tant que longueur maximale, comme quand même vous lisez un int
dynamic_bitset code> constructeur s'attend à
non signé long code>, pas
non signé long long code>: boost.org/doc/libs/1_46_0/libs/dynamic_bitset/...
Voici votre programme à peu près ré-écrit avec test: https://ideone.com/odhwe p> Remarque, vous ne pouvez pas construire immédiatement le bitset de votre entier car son constructeur attend dynamic_bitset code>
non signé long code>
. Si vous pouvez obtenir avec des longs non signés, toute la boucle de conversion est inutile p> p>
WOWWWWW !! Vos compétences en programmation sont tout simplement incroyables! Je n'ai jamais imaginé écrire quelque chose comme ça. J'espère à l'avenir, je suis capable de faire la même chose. Maintenant, j'ai deux doutes. 1.Qui sont les avantages d'utiliser à l'aide de l'espace de noms Std; Au début du code ou de l'écriture STD :: Quand Necesary ?? 2. J'ai besoin de relier les bibliothèques
@Thomas 1. Stackoverflow.com/questions/1452721/... 2. Vous avez dit que vous regardiez dans dynamic_bitset code>. Boost est la bibliothèque qui le fournit, avec de nombreuses autres choses utiles. Voir Boost.org pour plus de détails.
Une question sur la variable Dec, déclarée non signée longtemps longtemps. Comme je souhaite l'utiliser pour des nombres plus importants comme par exemple pour 5000 bits Bitset, je pensais à déclarer cette variable comme chaîne. Mais je ne pouvais pas faire des opérations mathématiques pour le convertir en binaires. Que me recommanderiez-vous de faire? Merci!
Pour ceux qui n'utilisent pas boost - vous pouvez utiliser vecteur
Vous pouvez le faire sans utiliser la bibliothèque de boost.
Vous pouvez attribuer de manière dynamique le bitset. Donc, au lieu de p> , vous pouvez simplement faire: p> oui, il fonctionne !! p> Puis plutôt que d'utiliser un vecteur séparé pour stocker les positions des 1s, vous pouvez faire quelque chose comme ceci: p> espère qu'il aide. P> p>
Une autre solution utilisant STD :: Bitset est de définir un bitset assez grand, par exemple Bitset <1000>. p>
Ensuite, vous pouvez utiliser une variable pour contrôler les bits réels et vous pouvez toujours utiliser les fonctions de membre de Bitset P>
Notez que la variable
déc code> que vous utilisez est 64 bits, cela ne fonctionnera donc pas correctement pour les plus grands numéros et les 5000 bits Bitset sont inutiles de cette manière. Vous devez stocker le numéro dans une chaîne à la place.
@schnaader. Merci Schnaader. Je pensais à la plus haute variable de performance à la variable Dec, mais je pense que la seule solution sera stockée en décharge comme une chaîne, comme vous le recommandez. Donc merci pour votre entrée. :)