Как реализовать динамический набор битов в моем конкретном коде - PullRequest
6 голосов
/ 11 марта 2011

Я использую набор битов и для повышения производительности своего кода я хочу изменить его на динамический набор битов, но после прочтения некоторых сообщений, связанных с этим, я все еще не знаю, как определить свой код.

Итак, я приложил свой код, и я хотел бы знать, может ли кто-нибудь из вас помочь мне дать мне некоторые идеи о том, что я должен изменить и как.

Заранее спасибо:)

// 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 ]

9 голосов
/ 11 марта 2011

Самый простой способ иметь динамический битовый набор - это использовать его;) http://www.boost.org/doc/libs/1_36_0/libs/dynamic_bitset/dynamic_bitset.html

ОБНОВЛЕНИЕ: полный пример

#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 голосов
/ 10 мая 2012

Для тех, кто не использует Boost - вы можете использовать vector<bool>, который оптимизирован, поэтому каждый элемент использует только 1 бит.

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

3 голосов
/ 11 марта 2011

Вот ваша программа, примерно переписанная с помощью 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 from decimal to binary
    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';

   // Storage of the position with 1 values
   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";
}

тестового прогона: https://ideone.com/OdhWE

Обратите внимание, вы не можете сразу создать битовый набор из целого числа, потому что его конструктор ожидает unsigned long.Если вы можете обойтись без длинных без знака, весь цикл преобразования не нужен

2 голосов
/ 11 марта 2011

Попробуйте использовать Boost * dynamic_bitset .

0 голосов
/ 31 октября 2015

Другое решение, использующее std :: bitset, состоит в том, чтобы определить достаточно большой набор битов, например bitset <1000>.

Затем вы можете использовать переменную для управления фактическими битами, и вы все еще можете использовать функции-члены набора битов

0 голосов
/ 11 августа 2012

Вы можете сделать это, не используя библиотеку наддува.

Вы можете динамически назначать набор битов. Так что вместо

for(x=0;x<binaryNumber.size();x++)
{
    binaryNumber[x]=dec%2;
    dec=dec/2;
}

Вы можете просто сделать:

 binaryNumber = dec;  

Да, это работает !!

Тогда вместо того, чтобы использовать отдельный вектор для хранения позиций единиц, вы можете сделать что-то вроде этого:

for(int i=0;i<binaryNumber.size();i++){
    if(binaryNumber[i])
        cout << "Position of 1: " << i << endl;
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...