在signed char C ++ 11中进行位移

时间:2015-12-08 02:22:25

标签: c++ c++11 vector transpose

我有k(0

我的C ++代码从文件中读取并将每个文件的内容存储到Show

我希望合并(concat)然后将它们存储在一个vector<signed char>中。

vector<signed char>

我希望将它们存储在File 1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Stored in vector1 File 2: 1 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 Stored in vector2 File 3: 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Stored in vector3 File 4: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Stored in vector4 File 5: 1 1 0 1 1 0 0 0 1 1 1 0 0 0 1 0 0 0 1 0 Stored in vector5

  • 存储vector<signed char> vectork,其中每个元素的位模式为vectork[0] - first col
  • 存储[0 0 0 0 1 0 1 1],其中每个元素的位模式为vectork[1] - 第二列
  • 存储[0 0 0 0 1 1 0 1],其中每个元素的位模式为vectork[2] - 第三列

我试过

[0 0 0 0 1 0 0 0]

以上是否正确?

3 个答案:

答案 0 :(得分:0)

使用bitset可以轻松完成,但是,如果你选择这样做,它看起来就像这样。

我仍然对你究竟想要做什么感到困惑,但似乎你正试图将所有这些向量都变成一个二维向量(你做了一组矢量,但我觉得你好像是这样想的。)

这将获得所有向量,并将它们附加到一个新的向量向量中。

// Example program
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    vector<signed char> vector1 = {0,1,0,1,0,1,0,1};
    vector<signed char> vector2= {0,0,0,1,0,1,0,1};
    vector<signed char> vector3= {0,1,1,1,0,1,0,1};
    vector<signed char> vector4= {1,1,0,1,0,1,0,1};
    vector<signed char> vector5= {1,0,0,1,0,1,0,1};

    vector<vector<signed char>> vectork(5, vector<signed char>(8));
    vectork.clear();
    vectork.push_back(vector1);
    vectork.push_back(vector2);
    vectork.push_back(vector3);
    vectork.push_back(vector4);
    vectork.push_back(vector5);


    //to check if it correctly works (it does).
    for(vector<signed char> v : vectork) {
        for(signed char i : v) {
            printf("%d ", i);
        }
        printf("\n");
    }
}

输出如下:

0 1 0 1 0 1 0 1 
0 0 0 1 0 1 0 1 
0 1 1 1 0 1 0 1 
1 1 0 1 0 1 0 1 
1 0 0 1 0 1 0 1 

如果您尝试做一些稍微不同的事情,请告诉我,我可以为您调整一下,或者如果您需要对我写的内容进行任何解释,或者一般有任何问题。

答案 1 :(得分:0)

首先,我建议您使用std::vector<bool>而不是std::vector<signed char>这是出于性能原因,因为您的编译器可能通过将1个字节中的8个布尔值存储为存储1布尔值来减少内存使用量在一个字节。其次,我认为你完全误解了位移的过程,据我所知,你发布的只是试图连接两个STL向量,这被问到here。作为参考,我已经包含了Robert Gamble的优秀答案中的代码片段。在你的

vector1.insert( vector1.end(), vector2.begin(), vector2.end() );

答案 2 :(得分:0)

#include <vector>

std::vector<signed char>
merge(const std::vector<signed char>& vector1,
      const std::vector<signed char>& vector2,
      const std::vector<signed char>& vector3,
      const std::vector<signed char>& vector4,
      const std::vector<signed char>& vector5)
{
    std::vector<signed char> result;
    result.reserve(vector1.size());

    auto i1 = vector1.begin();
    auto i2 = vector2.begin();
    auto i3 = vector3.begin();
    auto i4 = vector4.begin();
    auto i5 = vector5.begin();

    while (i1 != vector1.end()) {
        int n = 0;
        for (auto *v: { &i1, &i2, &i3, &i4, &i5 })
            n = n*2 + *(*v)++;
        result.push_back(n);
    }

    return result;
}

// test it:
#include <algorithm>
int main()
{
    auto v = merge({ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                   { 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
                   { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                   { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                   { 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0 });

    auto expected = { 0b1011, 0b1101, 0b1000, 0b0001, 0b0001, 0b0000, 0b0000, 0b0000,
                      0b0001, 0b1001, 0b1001, 0b0000, 0b0000, 0b0000, 0b1001, 0b0000,
                      0b0000, 0b0000, 0b1001, 0b0000 };

    return !std::equal(expected.begin(), expected.end(), v.begin());
}