位集和数字序列 C++

bitset and numerical sequence C++

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

数字顺序为:1,2,3,5,8,13,21。我可以问你我的代码是否适合 peresent 这个数字序列? 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;
}

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

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

is bitset can store more than 1 value in it?

嗯,是的——它是一组位,因此得名。每个位可以开或关,可以认为是一个"value"。因此,a std::bitset<32> 可以在其中编码 32 "values"。最终,整个位集本身一次只有一个值,但这就是 "encoding" 数据的美妙之处——每个值都由更小的构建块组成。要解决这个问题,您需要记住,存储在计算机上的每个 值都由一系列位组成。

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

例如,一旦您设置了位 1、2、3、5、8、13、21(我在这里假设一个基于 0 的系统,以便您可以支持输入 0), 你的位集将 "contain":

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

当从二进制转换为十进制时,此序列为数字 1,954,808,832,这正是您随后对 bitset 对象调用 to_ulong() 时将得到的结果。

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