0

私はC++が初めてです。0 から 0、0 から 1、1 から 0、1 から 1 への遷移数を 9 ビット シーケンスで計算したいと考えています。次のコードを書きました。

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 の最後のビット値を保存して、最後のビットセット出力の最後のビットから次のビットセット出力の最初のビットへの遷移を確認する方法は?
  2. これがうまくいかない場合、ベクトルに保存し、イテレータを使用して遷移を確認するにはどうすればよいですか?
4

2 に答える 2

1

まず、ループインデックスjがの終わりを超えて実行されていbitsetます。インデックスは0からbitseq.size()-1(両端を含む)になります。テストする場合jj+1最大値jはですbitseq.size()-2

第二に、あなたの==0に現れる部分ifは奇妙です、あなたはただ使うべきです

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

2つの使用に注意してください&&。このコードでは1つ&でも機能しますが、意図を正しく伝える演算子を使用する方がよいと思います。

そして、質問に答えるために、最初に番兵値に設定された「最後のビット」変数を保持し(最初の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

このようなものがあなたにとってより良いでしょうか?[0] = 0->0、[1] = 0->1、[2] = 1->0、[3] = 1->1 の 4 つの int の配列を使用します。

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 に答える