我需要帮助完成一项我似乎无法弄清楚的编程实验室作业。
问题是 :
允许用户输入 4 个整数值,全部在 0 到 15 之间(含 0 和 15)。将这 4 个值存储到名为“packit”的单个 32 位整数中 允许用户选择他们希望从“packit”恢复的 4 个整数中的哪一个。输入“1”将恢复第一个值输入,“2”将恢复第二个值,“3”将恢复第三个值,依此类推。仅使用位操作来存储和恢复值。
这是我到目前为止所拥有的:
#include <iostream>
using namespace std;
int getInput(){
int in;
cout << "Input a number: ";
cin >> in;
return in;
}
int main(){
int input1, input2, input3, input4;
int output1, output2, output3, output4;
unsigned int data = 32; // makes room for the 4 integers
input1 = getInput();
input2 = getInput();
input3 = getInput();
input4 = getInput();
data = data << 2; //makes room for the input
data = data | input1;
output1 = data >> 2;
cout << output1;
return 0;
}
我停在output1
只是为了测试它,但它不起作用。然而,这是我经过几个小时的尝试后得出的结果。我不确定我做错了什么。我正在遵循课堂上从黑板上抄下来的笔记。
任何帮助,将不胜感激。
您可以通过位操作或联合来完成此操作。联合往往是更具可读性的方法。
union
{
unsigned char[4] data;
unsigned long packed;
} packit;
data[0] = 1;
data[1] = 1;
data[2] = 1;
data[3] = 1;
std::cout << "packit = " << packit.packed;
// packit = 16843009
// 00000001 00000001 00000001 00000001
注意:通过联合进行类型双关仅在 C 中有效。
要使用位运算,您需要同时执行移位和and
or or
正确检索和设置位的操作。
unsigned long packit = 0;
// Set data0
packit |= data0;
// Set data1
packit |= (data1 << 8)
// Set data2
packit |= (data2 << 16)
// Set data3
packit |= (data3 << 24)
阅读与设置相反。您需要清除除您想要读取的值之外的所有值并将其移动到正确的位置。
unsigned char data0 = (packit & 0x000000FF);
unsigned char data1 = (packit & 0x0000FF00) >> 8;
unsigned char data2 = (packit & 0x00FF0000) >> 16;
unsigned char data3 = (packit & 0xFF000000) >> 24;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)