如何使用bitset计算位转换< >

时间:2011-10-31 08:22:24

标签: c++ bitset

我是C ++的新手。我想计算9位序列中从0到0,0到1,1到0和1到1的转换次数。我写了以下代码;

int main { 
srand((unsigned)time(0));
unsigned int x;
for (int i=0:i<=512;i++)  //    loop-1
{
x=rand()%512;
bitset<9>bitseq(x);
    for(int j=0;j<=bitseq.size();j++)  // loop-2
    {
    bool a= bitseq.test(j);
    bool b= bitseq.test(j+1)
    if ((a==0)&(b==0)==0)
    {
    transition0_0 = transition0_0 + 1; //  transition from 0 to 0
    }
    else if ((a==0)&(b==1)==0)
    {
    transition0_1 = transition0_1 + 1;
    else if ((a==1)&(b==0)==0)
    {
    transition1_0 = transition1_0 + 1;
    else
     {
     transition1_1 = transition1_1 + 1;

      cout<<transition0_0<<"    "<<transition0_1<<endl; 
      cout<<transition1_0<<"    "<<transition1_1<<endl;
     }
 }

有人请指导我以下

  1. 如何保存loop-2中的最后一位值以检查从最后一个bitset输出的最后一位到下一位bitset输出的第一位的转换?
  2. 如果这不起作用,我如何将其保存在向量中并使用迭代器检查转换?

2 个答案:

答案 0 :(得分:1)

首先,循环索引j正在bitset的末尾运行。指数从0到bitseq.size()-1(含)。如果您要测试jj+1j可以获得的最大值为bitseq.size()-2

其次,==0中显示的if部分很奇怪,您应该只使用

if( (a==0)&&(b==0) )

注意使用两个&&。虽然单个&适用于此代码,但我认为最好使用正确传达您意图的运算符。

然后回答你的问题,你可以保留一个最后设置为sentinel值的“最后一位”变量(表示你刚刚看到第一个bitseq)并在开始之前将它与bitseq [0]进行比较循环2.这是您的代码的修改版本,应该按照您的要求进行。

int main { 
  srand((unsigned)time(0));
  unsigned int x;
  int transition0_0 = 0,
      transition0_1 = 0,
      transition1_0 = 0,
      transition1_1 = 0;
  int prev = -1;

  for (int i=0:i<=512;i++)  //    loop-1
  {
    x=rand()%512;
    bitset<9> bitseq(x);

    if( prev != -1 ) // don't check this on the first iteration
    {
      bool cur = bitseq.test(0);
      if( !prev && !cur )
        ++transition0_0;
      else if( !prev && cur )
        ++transition0_1;
      else if( prev && !cur )
        ++transition1_0;
      else
        ++transition1_1;
    }

    for(int j=0;j+1<bitseq.size();j++)  // loop-2
    {
      bool a= bitseq.test(j);
      bool b= bitseq.test(j+1)
      if ((a==0)&&(b==0))
      {
        transition0_0 = transition0_0 + 1; //  transition from 0 to 0
      }
      else if ((a==0)&&(b==1))
      {
        transition0_1 = transition0_1 + 1;
      }
      else if ((a==1)&&(b==0))
      {
        transition1_0 = transition1_0 + 1;
      }
      else
      {
        ++transition1_1 = transition1_1 + 1;
      }
    } // for-2

    prev = bitseq.test(bitseq.size()-1); // update prev for the next iteration

    cout<<transition0_0<<"    "<<transition0_1<<endl; 
    cout<<transition1_0<<"    "<<transition1_1<<endl;
  } // for-1
} // main

答案 1 :(得分:0)

这样的事情对你有好处吗?使用4个整数的数组,其中[0] = 0-> 0,[1] = 0-> 1,[2] = 1-> 0,[3] = 1-> 1.

int main { 
   int nTransition[] = { 0,0,0,0 };
   bool a,b;
   unsigned int x;
   int j;

   srand ((unsigned)time(0));

   for (int i = 0: i < 512; i++) {

       x = rand () % 512;
       bitset<9> bitseq(x);

       if (i == 0) {
          a = bitseq.test (0);
          j = 1;
       } else
          j = 0;

       for (; j < bitseq.size (); j++) {

           b = bitseq.test(j);

           int nPos = (a) ? ((b) ? 3 : 2) : ((b) ? 1 : 0);
           nTransition[nPos]++;

           a = b;
       }
    }
 }