一种c ++程序,用于以二进制序列存储每个位1的位置

时间:2014-03-28 20:52:11

标签: c++

我已将此代码存储为以二进制序列输入的每个位1的位置。程序的输出不是所期望的。我得到的10100输出是0x7fff9109be00。这是代码:

#include <iostream>
#include <bitset>
using namespace std;

    int main()
    {
     bitset <5> inpSeq;
     int x = 0;
     int xorArray[x];
     unsigned int i;
     cout << "Enter a 5-bit sequence: \n";
     cin >> inpSeq;
     for ( i = 0; i < inpSeq.size(); i++)
     {
      if ( inpSeq[i] == 1 )
      {
      x = x+1;
      xorArray[x] = i; 
      }
     }
     cout << xorArray << "\n";
    }

为清晰起见而更新:我的想法是&#39; cout&lt;&lt; xorArray&#39;将打印位1的位置。

2 个答案:

答案 0 :(得分:2)

我对你想要达到的目标有点不清楚,但我认为以下内容可能有所帮助。

#include <iostream>
#include <bitset>
#include <list>

using namespace std;

int main() {
    bitset<5> inpSeq;
    unsigned int i;
    list<int> xorList;
    cout << "Enter a 5-bit sequence: \n";
    cin >> inpSeq;

    for (i = 0; i < inpSeq.size(); ++i) {
        if (inpSeq[i] == 1) {
            xorList.push_back(i);
        }
    }

    for (list<int>::iterator list_iter = xorList.begin();
         list_iter != xorList.end(); list_iter++)
    {
        cout << *list_iter << endl;
    }

    return 0;
}

我使用列表的原因是因为您提到要存储1位的位置。该列表被用作这些职位的容器,以防您在程序的另一个点需要它们。

原始代码的一个问题是你为变量'x'赋值0.当你声明xorArray [x]时,这意味着你实际上是在创建一个长度为0的数组。这是不正确的语法。看起来您实际上是在尝试在运行时动态分配数组的大小。这需要不同的语法和指针用法。该列表允许您为遇到的每个1位增长数据结构。

此外,您无法使用

打印数组的值
cout << xorArray << endl

那将打印数组中第一个元素的内存地址,因此,xorArray [0]。每当要打印数据结构(如列表或数组)的值时,都需要遍历结构并逐个打印值。这就是上面代码中第二个for()循环的目的。

最后,存储的值与0索引一致。如果您想要以1开头的仓位,则必须使用

xorList.push_back(i+1);

希望这有帮助!

答案 1 :(得分:2)

cout << xorArray << "\n";

这不会打印xorArray的元素;它会打印出它的地址。

你必须迭代(“循环”)它:

for (auto x : xorArray)
   cout << x << ' ';
cout << '\n';

你的另一个问题是你正在尝试使用C ++中不存在的可变长度数组。改为使用矢量。

现在 it gives you your desired output

#include <iostream>
#include <bitset>
#include <vector>

using namespace std;

int main()
{
    bitset<5> inpSeq("10111");

    std::vector<int> xorArray;

    for (unsigned int i = 0; i < inpSeq.size(); i++) {
        if (inpSeq[i] == 1)
            xorArray.push_back(i);
    }

    for (auto x : xorArray)
        cout << x << ' ';
    cout << '\n';
}

如果您因任何原因未使用C ++ 11,则可以采用传统方式执行最终循环:

for (std::vector<int>::const_iterator it  = xorArray.begin(),
                                      end = xorArray.end(),
     it != end; ++it) {
    cout << *it << ' ';
}

或天真的方式:

for (unsigned int i = 0; i < xorArray.size(); i++)
    cout << xorArray[i] << ' ';