【问题标题】:How to store randomly generated unsigned int numbers in a bitset如何将随机生成的无符号整数存储在位集中
【发布时间】:2015-04-27 04:55:40
【问题描述】:

我有一个位集,我需要在其中存储 # 个随机生成的整数(当然存储它的位表示)。所以,问题是我对如何做到这一点感到困惑。

即假设我一次生成一个整数(所有无符号整数)8、15、20。如何将最近生成的整数存储在现有位集中。

假设我首先生成“8”并存储在 bitset 中,然后生成“15”并将其存储在 bitset 中。

我不知道或不明白如何将这些值存储在位集中。

注意:我事先知道 bitset 的大小,大小基于我要生成的整数的数量,而且我也知道。所以,最后我需要的是一个位集,其中所有位集都与所有生成的整数的位相匹配。

感谢您的帮助。

【问题讨论】:

  • 您是否有任何理由要使用bitset 而不是setunordered_set
  • 我认为将数字存储为整数并在需要时创建相应的bitset 会更容易。
  • 嗨@gha.st,我想使用一个bitset,因为它可以让我轻松访问这些位。有时我需要访问 nth 位。或者从位 a 读取到位 b。等等,我已经读过 bitset 非常适合这样做。
  • @RSahu 你建议我怎么做?最后,我需要的是一个 bitset,其中 N 必须是所有生成整数的大小。我事先知道要生成多少个随机整数,所以我创建了具有该大小的位集。这有助于理解我需要做什么?感谢您的帮助。

标签: c++


【解决方案1】:

如何将最近生成的整数存储在现有位集中。

您可以从整数中生成一个临时的bitset,然后在两个bitsets 之间分配值。

示例程序:

#include <iostream>
#include <bitset>
#include <cstdlib>

int main()
{
   const int size = sizeof(int)*8;
   std::bitset<2*size> res;
   std::bitset<size> res1(rand());
   std::bitset<size> res2(rand());

   for ( size_t i = 0; i < size; ++i )
   {
      res[i] = res1[i];
      res[size+i] = res2[i];
   }

   std::cout << "res1: " << res1 << std::endl;
   std::cout << "res2: " << res2 << std::endl;
   std::cout << "res: " << res << std::endl;

   return 0;
}

输出:

res1: 01101011100010110100010101100111
res2: 00110010011110110010001111000110
res: 0011001001111011001000111100011001101011100010110100010101100111

更新

在给定整数的情况下设置bitset 值的函数可用于避免创建临时bitsets 的成本。

#include <iostream>
#include <bitset>
#include <cstdlib>
#include <climits>

const int size = sizeof(int)*8;

void setBitsetValue(std::bitset<2*size>& res,
                    int num,
                    size_t bitsetIndex,
                    size_t numIndex)
{
   if ( numIndex < size )
   {
      res[bitsetIndex] = (num >> numIndex) & 0x1;
      setBitsetValue(res, num, bitsetIndex+1, numIndex+1);
   }
}

int main()
{
   std::bitset<2*size> res;
   int num1 = rand()%INT_MAX;
   int num2 = rand()%INT_MAX;
   std::bitset<size> res1(num1);
   std::bitset<size> res2(num2);

   std::cout << "res1: " << res1 << std::endl;
   std::cout << "res2: " << res2 << std::endl;

   setBitsetValue(res, num1, 0, 0);
   setBitsetValue(res, num2, size, 0);

   std::cout << "res:  " << res << std::endl;

   return 0;
}

【讨论】:

  • 这实际上很有帮助,尽管我担心性能,因为我将生成大量整数,这意味着如果我生成 1000000 个整数,我将有 1000000 个临时位集。有没有办法只设置一个位集并设置每个新生成的整数的位?
  • @CarlosDavid,我怀疑有一些技巧可以避免临时的bitset。我不知道它的手。
猜你喜欢
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多