如何在一个字节中存储两个不同的东西,然后再次访问它们?

时间:2011-11-27 21:21:30

标签: c bit-manipulation

我正在为我的班级学习C语言。我需要知道的一件事是给出一个数组,我必须从两个字符中获取信息并将其存储在一个字节中。例如。如果字符串是“A1B3C5”,那么我必须在较高的3位中存储A = 001,然后在较低的5位中存储1。我必须运行,一次可以从数组中获取两个字符,并在此处打印该函数,

 void print2(char string[])
{
    int i = 0;
    int length = 0;
    char char1, char2;
    length = strlen(string);
    for ( i = 0; i <length; i= i + 2)
    {
        char1 = string[i];
        char2 = string[i+1];
        printf("%c, %c\n", char1, char2);
    }
}

但现在我不知道如何对其进行编码然后再次解码。有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:2)

假设有一个ASCII字符集,从字母中减去'@'并向左移五位,然后从表示该数字的字符中减去'0'并将其添加到第一部分。

答案 1 :(得分:2)

所以你有一个字节,你想要以下位布局:

76543210
AAABBBBB

要存储A,您可以:

unsigned char result;
int input_a = somevalue;
result &= 0x1F; // Clear the upper 3 bits.
// Store "A": make sure only the lower 3 bits of input_a are used,
// Then shift it by 5 positions. Finally, store it by OR'ing.
result |= (char)((input_a & 7) << 5);

阅读:

// Simply shift the byte by five positions.
int output_a = (result >> 5);

要存储B,您可以:

int input_b = yetanothervalue;
result &= 0xE0; // Clear the lower 5 bits.
// Store "B": make sure only the lower 5 bits of input_b are used,
// then store them by OR'ing.
result |= (char)(input_b & 0x1F);

阅读:

// Simply get the lower 5 bits.
int output_b = (result & 0x1F);

您可能想要了解布尔运算AND和OR,位移以及最后位掩码

答案 2 :(得分:1)

首先,一位只能代表两种状态:0和1,或者TRUE和FALSE。你的意思是一个字节,它由8位组成,因此可以代表2 ^ 8个状态。

两个在一个字节中放置两个值,使用逻辑OR(|)和按位移位(<<>>)。

我不会在这里发布代码,因为你应该学习这些东西 - 了解哪些位和字节以及如何使用它们非常重要。但如果您不清楚某些事情,请随时提出跟进问题。