почему байт с битами 01110011 не становится символом `s`? - PullRequest
0 голосов
/ 13 февраля 2019

Почему следующая программа не печатает символ s?:

#include <stdlib.h>
#include <stdio.h>


int main(void) {
    unsigned char s = '\0';
    unsigned int bits[8] = {0, 1, 1, 1, 0, 0, 1, 1};

    for (int i = 0; i < 8; i++) {
        s ^= bits[i] << i;
    }

    printf("%c\n", s);

    return 0;
}

Поэтому я в основном пытаюсь создать символ s из списка битов.Почему я получаю какой-то другой странный персонаж из этой программы?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Двоичное число хранится в обратном порядке в переменной char s, поэтому у вас возникает эта проблема.

0 1 1 1 0 0 1 1

оно становится

1 1 0 0 1 1 1 0

в 's'переменная.

0 голосов
/ 13 февраля 2019

Вы вставляете биты в порядке, обратном тому, который указан в источнике.Второй бит будет сдвинут на 1, а не на 6 и так далее.Таким образом, результирующее число равно

1 1 0 0 1 1 1 0

, что равно 0xce, десятичному 206 и, следовательно, не ASCII.

Кроме того, использование XOR для этого очень странно, оно должно быть просто побитовым ИЛИ (|).

Вот фиксированная попытка:

char s = 0;
const unsigned char bits[] = { 0, 1, 1, 1, 0, 0, 1, 1 };

for (int i = 0; i < 8; ++i) {
    s |= bits[i] << (7 - i);
}
printf("%c\n", s);

Это печатает s.

...