7

我正在使用 bitset 并提高代码的性能,我想将其更改为动态 bitset,但是在阅读了一些与此相关的帖子后,我仍然不知道如何定义我的代码。

所以我附上了我的代码,我想知道你们中的任何人是否可以帮助我给我一些关于我应该修改什么以及如何修改的想法。

提前致谢 :)

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

6 回答 6

10

拥有动态位集的最简单方法是使用一个;) 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;
}   
于 2011-03-11T15:21:50.150 回答
6

对于那些不使用 Boost 的人 - 您可以使用vector<bool>经过优化的,因此每个元素仅使用 1 位。

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

于 2012-05-10T16:51:38.903 回答
4

这是您的程序大致重写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. 如果您可以使用无符号长整数,则不需要整个转换循环

于 2011-03-11T15:48:24.100 回答
3

尝试使用Boostdynamic_bitset

于 2011-03-11T15:21:13.997 回答
0

使用 std::bitset 的另一个解决方案是定义足够大的位集,例如 bitset<1000>。

然后你可以使用一个变量来控制实际的位,你仍然可以使用 bitset 的成员函数

于 2015-10-31T15:21:09.913 回答
-1

您可以在不使用 boost 库的情况下做到这一点。

您可以动态分配位集。所以而不是

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

你可以简单地做:

 binaryNumber = dec;  

是的,它确实有效!

然后,您可以执行以下操作,而不是使用单独的向量来存储 1 的位置:

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

希望能帮助到你。

于 2012-08-11T13:36:08.467 回答