0

我是 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. 如何保存循环 2 中的最后一位值以检查从最后一个 bitset 输出的最后一位到下一个 bitset 输出的第 1 位的转换?
  2. 如果这不起作用,我如何将它保存在向量中并使用迭代器来检查转换?
4

2 回答 2

1

首先,循环索引 j 超过了bitset. 指数从 0 到bitseq.size()-1(含)。如果您要测试j并且可以取j+1的最大值是.jbitseq.size()-2

其次,==0出现在您if的 s 中的部分很奇怪,您应该只使用

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

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

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

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
于 2011-10-31T08:42:17.840 回答
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;
       }
    }
 }
于 2011-10-31T13:09:31.033 回答