7
votes

Comment implémenter Bitset dynamique dans mon code spécifique

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;
}


2 commentaires

Notez que la variable déc 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. :)


6 Réponses :


3
votes

essayer d'utiliser boost 's dynamic_bitset .


2 commentaires

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?



10
votes

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;
}   


3 commentaires

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 constructeur s'attend à non signé long , pas non signé long long : boost.org/doc/libs/1_46_0/libs/dynamic_bitset/...



4
votes

Voici votre programme à peu près ré-écrit avec dynamic_bitset xxx

test: https://ideone.com/odhwe

Remarque, vous ne pouvez pas construire immédiatement le bitset de votre entier car son constructeur attend non signé long . Si vous pouvez obtenir avec des longs non signés, toute la boucle de conversion est inutile


3 commentaires

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 et pour exécuter mon programme. Je les ai trouvés ici: www.boost.org/doc/libs/1_46_0/boost/lexical_cast.hpp et www.boost.org/doc/libs/1_46_0/boost/dynamic_bitset/dynamic_b iTREET.HPP, mais comment puis-je Liez-les à mon code ??


@Thomas 1. Stackoverflow.com/questions/1452721/... 2. Vous avez dit que vous regardiez dans dynamic_bitset . 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!



5
votes

Pour ceux qui n'utilisent pas boost - vous pouvez utiliser vecteur qui est optimisé afin que chaque élément utilise seulement 1 bit.

http://www.cplusplus.com/reference/stl/vector/


0 commentaires

-1
votes

Vous pouvez le faire sans utiliser la bibliothèque de boost.

Vous pouvez attribuer de manière dynamique le bitset. Donc, au lieu de xxx

, vous pouvez simplement faire: xxx

oui, il fonctionne !!

Puis plutôt que d'utiliser un vecteur séparé pour stocker les positions des 1s, vous pouvez faire quelque chose comme ceci: xxx

espère qu'il aide.


0 commentaires

0
votes

Une autre solution utilisant STD :: Bitset est de définir un bitset assez grand, par exemple Bitset <1000>.

Ensuite, vous pouvez utiliser une variable pour contrôler les bits réels et vous pouvez toujours utiliser les fonctions de membre de Bitset


0 commentaires