bitset和数字序列C ++

时间:2017-04-06 13:02:56

标签: c++ bitset

我正在通过Stanley Lippman的书来学习C ++。我正在研究名为“类Bitset”的段落。有一个练习,他给我数字序列以转换成bitset< 32>。

数字序列为:1,2,3,5,8,13,21。我可以问你,我的代码是否适合表示这个数字序列? Lippman还希望我使用bitset中的每个位来表示序列,但是bitset可以存储多于1的值吗?我第一次这样做,我唯一的想法是:

int index = 0;
const int size_ = 7;
unsigned long f2[size_];

int main()
{
   setlocale(LC_ALL,"rus");

   string try1;

   cout << "Type your numerical sequence in binary code: " << endl;

      while (cin >> try1) {

         bitset<32> go(try1);

         if ( go.to_ulong() > 21 )  { cout << "End of sequence" << endl; break; }        

         f2[index] = go.to_ulong();

         index++;

         try1.clear();

         go.reset();
       }

   for ( index; index >= 0; index-- ) {
       cout << f2[index] << " ";
   }

   system("pause");

   return 0;
}

2 个答案:

答案 0 :(得分:0)

你可能正在寻找这样的东西:

#include <bitset>
#include <iostream>

int main()
{
  std::bitset<32> my_bitset;
  for (auto position : { 1, 2, 3, 5, 8, 13, 21 })
  {
    my_bitset.set(position, true);
  }

  // Initialize with "default" bitset mask
  std::bitset<32> another_bitset(my_bitset.to_ulong());
  for (auto bit = 0u; bit < another_bitset.size(); ++bit)
  {
    std::cout << "bit no. " << bit << " is " << (another_bitset.test(bit) ? "" : "not ") << "set" << std::endl;
  }

  return 0;
}

答案 1 :(得分:0)

  

是否bitset可以存储多于1个值?

嗯,是的 - 这是一组比特,因此得名。每个位都可以打开或关闭,这可以被视为一个“值”。因此,std::bitset<32>可以在其中编码32个“值”。最终,整个bitset本身一次只有一个值,但这就是“编码”数据的美妙 - 每个值都由较小的构建块组成。要解决此问题,您需要记住计算机上存储的每个值都包含一系列位。

据推测,您应该通过设置位置x,y,...,z的位来对序列x,y,...,z进行编码。为此,您可以使用函数set

例如,一旦你设置了1,2,3,5,8,13,21位(我假设这里有一个基于0的系统,那么你可以支持输入0) ,你的bitset将“包含”:

#0   #4   #8   #12  #16  #20  #24  #28  #32
+----+----+----+----+----+----+----+----+
|0111 0100 1000 0100 0000 0100 0000 0000|
+-^^^+-^--+^---+-^--+----+-^--+----+----+
  |||  |   |     |         |

当从二进制转换为十进制时,此序列的编号为1,954,808,832,如果您随后在bitset对象上调用to_ulong(),这正是您所获得的。

在您的代码中,您为每个输入的值创建一个新的bitset,这是无用的;你的实际存储只是一个unsigned long的数组,这与练习的精神不一致(而是使用bitset代替存储)。你也在对象超出范围之前(在循环体的末尾)调用reset(),它什么也没做。