Как рассчитать битовые переходы, используя bitset <> - PullRequest
0 голосов
/ 31 октября 2011

Я новичок в 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, чтобы проверить переход от последнего битапоследнего выхода набора битов в 1-й бит следующего выхода набора битов?
  2. Если это не работает, как я могу сохранить его в векторе и использовать итераторы для проверки переходов?

Ответы [ 2 ]

1 голос
/ 31 октября 2011

Прежде всего, индекс цикла j проходит после конца bitset. Индексы идут от 0 до bitseq.size()-1 (включительно). Если вы собираетесь протестировать j и j+1, самое большое значение j может быть bitseq.size()-2.

Во-вторых, часть ==0, которая появляется в ваших if s, странная, вы должны просто использовать

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

Обратите внимание на использование двух &&. Хотя для этого кода работает один &, я думаю, что лучше использовать оператор, который правильно передает ваши намерения.

А затем, чтобы ответить на ваш вопрос, вы можете оставить переменную «последний бит», изначально установленную в значение часового значения (указывающее, что вы видите первый битовый запрос только сейчас), и сравнить его с 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
0 голосов
/ 31 октября 2011

Будет ли что-то подобное лучше для вас?Используйте массив из 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;
       }
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...