7 votes

Comment mettre en œuvre un bitset dynamique dans mon code spécifique

Je utilise bitset et pour améliorer les performances de mon code je veux le changer en bitset dynamique, mais après avoir lu quelques messages à ce sujet, je ne sais toujours pas comment définir mon code.

Alors j'ai joint mon code et j'aimerais savoir si l'un d'entre vous pourrait m'aider en me donnant des idées sur ce que je devrais modifier et comment.

Merci d'avance :)

// Programme qui convertit un nombre de décimal en binaire et montre les positions
// où le bit du nombre binaire contient 1

#include 
#include 
#include 
#include 

using namespace std;

int main()
{

    unsigned long long int dec;
    bitset<5000> binaryNumber;
    bitset<5000> mask;
    mask = 0x1;

    cout << "Écrivez un nombre en décimal : ";
    cin >> dec;

    // Conversion de décimal à binaire
    int x;
    for (x = 0; x < binaryNumber.size(); x++)
    {
        binaryNumber[x] = dec % 2;
        dec = dec / 2;
    }

    cout << "Le nombre " << dec << " en binaire est : ";
    for (x = (binaryNumber.size() - 1); x >= 0; x--)
    {
        cout << binaryNumber[x];
    }
    cout << endl;

    // Stockage des positions avec des valeurs 1
    vector valueTrue;
    for (int r = 0; r < binaryNumber.size(); r++) //
    {
        if (binaryNumber.test(r) & mask.test(r)) // si les deux sont des bit "1"
                                                 // nous stockons dans le vecteur valueTrue
        {
            valueTrue.push_back(r);
        }
        mask = mask << 1;
    }

    int z;
    cout << "Les bits 1 sont à la position : ";
    for (z = 0; z < valueTrue.size(); z++)
    {
        cout << valueTrue.at(z) << " ";
    }
    cout << endl;

    system("pause");
    return 0;
}

10voto

Tristram Gräbener Points 5566

La manière la plus simple d'avoir un dynamic bitset est d'en utiliser un ;) http://www.boost.org/doc/libs/1_36_0/libs/dynamic_bitset/dynamic_bitset.html

MISE À JOUR : fournir un exemple complet

#include
#include 
int main() {
    unsigned long long dec;
    std::cout << "Écrivez un nombre en décimal : ";
    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 << "La position " << i << " est 1" << std::endl;
    }
    //system("pause");
    return 0;
}

6voto

vedranm Points 391

Pour ceux qui n'utilisent pas Boost - vous pouvez utiliser vector qui est optimisé de sorte que chaque élément n'utilise qu'1 bit.

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

4voto

Cubbi Points 25339

Voici votre programme grossièrement réécrit avec dynamic_bitset

#include <iostream>
#include <climits>
#include <string>
#include <boost/lexical_cast.hpp>
#include <boost/dynamic_bitset.hpp>
int main()
{
    std::cout<<"Write a number in decimal: ";
    unsigned long long dec;
    std::cin >> dec;

    // Conversion du décimal au binaire
    std::string str;
    for(unsigned long long d = dec; d>0; d/=2)
        str.insert(str.begin(), boost::lexical_cast<char>(d&1) );
    boost::dynamic_bitset<> binaryNumber(str);
    std::cout << "The number " << dec << " in binary is: " << binaryNumber<<'\n';

   // Stockage des positions avec des valeurs 1
   std::vector<size_t> valueTrue;
   for( size_t pos = binaryNumber.find_first();
        pos != boost::dynamic_bitset<>::npos;
        pos = binaryNumber.find_next(pos))
       valueTrue.push_back(pos);

   std::cout<<"Bit 1 are in position: ";
   for(size_t z=0; z < valueTrue.size(); ++z)
       std::cout << valueTrue[z] << " ";
   std::cout << "\n";
}

test run: https://ideone.com/OdhWE

Notez que vous ne pouvez pas construire immédiatement le bitset à partir de votre entier car son constructeur attend unsigned long. Si vous pouvez vous en sortir avec des unsigned longs, toute la boucle de conversion est inutile

3voto

Steve Points 913

Essayez d'utiliser le Boost's dynamic_bitset.

0voto

camino Points 1495

Une autre solution en utilisant std::bitset est de définir un bitset suffisamment 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 membres de bitset.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X