如果输入为:
73 68 69 65
输出应该是这样的:
0 1 0 0 1 0 0 1 ///73 in binary form
0 1 0 0 0 1 0 0 ///68 in binary form
0 1 0 0 0 1 0 1 ///69 in binary form
0 1 0 0 0 0 0 1 ///65 in binary form
如上所述,矩阵有8列,每行都包含十进制数的二进制形式。
这是我迄今为止的代码:
int n, x;
cin >> n;
auto A = vector<vector<int>>(n, vector<int>(8)); ///8 columns as mentioned
while (n--)
{
cin >> x;
for (int j = 8; j >= 0; --j) ///inserting the digits for each number
if ((x >> j) & 1)
A[i].emplace_back(1);
else
A[i].emplace_back(0);
}
for (auto rows : A)
{
for (auto elements : rows)
cout << elements << " ";
cout << "n";
}
我尝试使用逐位运算,但任何方法都可以使用vector<vector<int>>
。
如果你能回答,我们将不胜感激,感谢你的阅读和回答!
还有第二个问题,它显示的是16位0000000000010001001,而不是01001001,开头有很多零。例如,如果输入是73。
您的解决方案背后的主要问题是Int类型不是存储在一个字节上,我制定了一个适合您代码的解决方案。
注意:我将输入存储在一个字节中的无符号字符中(而不是使用int(,通过这样做,从cin读取的输入是一个字符,例如:"8",所以考虑到ASCII表,我可以得到由字符减去48表示的数字(请参阅ASCII表了解解释(:
int main()
{
int n;
unsigned char x;
cin >> n;
auto A = vector<vector<int> >(n); ///8 columns as mentioned
while (n--)
{
cin >> x;
x -= 48;
auto aByte = vector<int>(8);
for (int j = 0; j < 8 ; ++j) ///inserting the digits for each number
{
if ( (x >> j) & 0x01 )
aByte[7 - j] = 1;
else
aByte[7 - j] = 0;
}
A[n] = aByte;
}
for (auto rows : A)
{
for (auto elements : rows)
cout << elements << " ";
cout << "n";
}
}
上面的解决方案只适用于一个数字,对于更多的数字(但仅限于一个字节表示(,您可以将cin转换为int,然后将int转换为无符号字符,只需替换以下代码行:
cin >> x;
x -= 48;
这些:
int i;
cin >> i;
x = static_cast<unsigned char>(i);