首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用位集<>计算位转换

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

Stack Overflow用户
提问于 2011-10-31 08:22:24
回答 2查看 365关注 0票数 0

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

代码语言:javascript
复制
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中的最后一位值,以检查从上一位集输出的最后一位到下一位集输出的第一位的转换?如果不起作用,如何将其保存在向量中并使用迭代器检查转换?
EN

回答 2

Stack Overflow用户

发布于 2011-10-31 08:42:17

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

第二,出现在您的==0中的if部件很奇怪,您应该只使用

代码语言:javascript
复制
if( (a==0)&&(b==0) )

注意两个&&的用法。虽然单个&适用于这段代码,但我认为最好使用正确表达您意图的操作符。

然后,为了回答您的问题,您可以保留一个最初设置为哨位值的“最后一位”变量(表示您正在看到第一个位),并在循环2开始之前将其与bitseq进行比较。下面是您的代码的修改版本,可以按照您的要求进行操作。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-10-31 13:09:31

这样的事对你更好吗?使用4个ints数组,其中= 0->0,1= 0->1,2= 1->0,3= 1->1。

代码语言:javascript
复制
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;
       }
    }
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7951262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档