Как хранить две разные вещи в одном байте, а затем снова обращаться к ним? - PullRequest
2 голосов
/ 28 ноября 2011

Я пытаюсь выучить C для своего класса.Одна вещь, которую мне нужно знать, это массив, мне нужно взять информацию из двух символов и сохранить ее в одном байте.Например,если строка "A1B3C5", то я должен хранить A = 001 в старших 3 битах, а затем хранить 1 в младших 5 битах.Я должен использовать функцию, которая может получать два символа из массива за раз и печатать ее здесь, вот эта функция,

 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 ]

2 голосов
/ 28 ноября 2011

Итак, у вас есть байт, и вы хотите следующую битовую разметку:

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);

Возможно, вы захотите прочитать о логических операциях И и ИЛИ, битовом сдвиге и, наконец, битовых масках .

2 голосов
/ 28 ноября 2011

Предполагая набор символов ASCII, вычтите '@' из буквы и сдвиньте влево пять битов, затем вычтите '0' из символа, представляющего цифру, и добавьте его в первую часть.

1 голос
/ 28 ноября 2011

Прежде всего, один бит может представлять только два состояния: 0 и 1, или ИСТИНА и ЛОЖЬ.То, что вы имеете в виду, это байт, который состоит из 8 битов и может, таким образом, представлять 2 ^ 8 состояний.

Два положите два значения в один байт, используйте логическое ИЛИ (|) и битовое смещение (<< и >>).

Я не публикую здесь код, так какВы должны изучить этот материал - очень важно знать, что такое биты и байты и как с ними работать.Но не стесняйтесь задавать дополнительные вопросы, если вам что-то не понятно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...