有符号字符C++11中的位移位

Bit shifting in signed char C++11

本文关键字:C++11 符号 字符      更新时间:2023-10-16

我有k(0<k<8)个CSV文件,其中包含全部为0或1的值。

我的C++代码从文件中读取并将每个文件的内容存储到vector<signed char>中。

我希望合并(concat),然后将它们存储在单个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],其中每个元素具有作为[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]-第三列的位模式

我试过

    vectork.resize(vector1.size(),0);
    for ( int i = 0; i < vector1.size(); i++ ) {
       vectork[i] = vectork[i] << 1;
      if (vector1[i] == 1) vectork[i] +=1;
      vectork[i] << 1;
      if (vector2[i] == 1) vectork[i] +=1;
      vectork[i] << 1;
      if (vector3[i] == 1) vectork[i] +=1;
      vectork[i] << 1;
      if (vector5[i] == 1) vectork[i] +=1;
    }

以上内容正确吗?

使用位集会容易得多,但是,如果你选择这样做,它会看起来像这样。

我仍然有点困惑,你到底想做什么,但似乎你想把所有这些向量都变成一个二维向量(你做了一个向量数组,但我觉得你是这样想的)。

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

// 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 

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

首先,我建议您使用std::vector<bool>而不是std::vector<signed char>。这是专门出于性能原因,因为您的编译器可能会通过在1个字节中存储8个布尔值来减少内存使用量,而不是在一个字节中存储1个布尔值。其次,我认为你完全误解了比特移位的过程,据我所知,从你发布的内容来看,你只是试图连接两个STL矢量,这是这里所问的。为了参考,我附上了Robert Gamble精彩回答的代码片段。在中

vector1.insert( vector1.end(), vector2.begin(), vector2.end() );
#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());
}