有符号字符C++11中的位移位
Bit shifting in signed char C++11
我有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());
}
相关文章:
- MacOS 上的 Xcode 11 项目不在一个函数中使用 sin 和 cos:未定义的符号"___sincosf_stret"
- C++11 标准是否保证零值有符号整数的一元减号为零?
- C++11 书籍符号
- R 包安装错误:重新定位 0 具有无效的符号索引 11
- C++11 无符号字符在使用运算符 = 时变为 int
- 符号将11位扩展到32位
- GCC:Get LD:对于架构X86_64在OS X 10.11.5上找不到的符号
- C++ concurrent_unordered_map C++11 Microsoft 使用无符号长作为密钥/哈希函数
- DirectX 11 中未解析的外部符号'_D3DX10CreateFontIndirectA@12'
- C++11是否保证余数的符号就是被除数的符号
- Visual Studio 11 GLFW外部符号错误
- 在 C++11 中使函数模板参数无符号
- C++11 在开关大小写中混合枚举类和无符号 int 将无法编译
- C++和 directx 11 错误,没有为 dxgi.dll 加载符号
- POCO链接错误,OS X 10.11.2上体系结构x86_64的未定义符号
- C++11是否允许在标识符中使用美元符号
- 有符号字符C++11中的位移位
- 在windows上编译GDAL 1.11.0时未解析的外部符号
- 在Eclipse Juno ADT中启用c++ 11符号解析
- 在vc++ 11上安装libCURL -无法解析的外部符号错误