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

How to calculate bit transitions using bitset < >

本文关键字:计算 转换 gt 何使用 lt      更新时间:2023-10-16

我是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输出的第一个比特的过渡?
  2. 如果这不起作用,我怎么能把它保存在矢量和使用迭代器来检查过渡?

首先,循环索引j运行在bitset的末尾。指数从0到bitseq.size()-1(包括)。如果你要测试jj+1, j可以取的最大值是bitseq.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

这样的东西对你会更好吗?使用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;
       }
    }
 }