Преобразование Char в двоичный в C - PullRequest
6 голосов
/ 23 октября 2011

Я пытаюсь преобразовать символ в его двоичное представление (поэтому символ -> ascii hex -> двоичный).

Я знаю, что для этого мне нужно сместиться и AND. Однако мой код по какой-то причине не работает.

Вот что у меня есть. *temp указывает на индекс в строке C.

char c;
int j;
for (j = i-1; j >= ptrPos; j--) {
    char x = *temp;
    c = (x >> i) & 1;
    printf("%d\n", c);
    temp--;
}

Ответы [ 3 ]

28 голосов
/ 23 октября 2011

Мы показываем две функции, которые печатают один символ в двоичном формате.

void printbinchar(char character)
{
    char output[9];
    itoa(character, output, 2);
    printf("%s\n", output);
}

printbinchar (10) запишет в консоль

    1010

itoa - это библиотечная функция, которая преобразуетодно целочисленное значение для строки с указанным основанием.Например ... itoa (1341, output, 10) запишет в выходную строку "1341".И, конечно же, itoa (9, output, 2) запишет в выходную строку «1001».

Следующая функция выведет на стандартный вывод полное двоичное представление символа, то есть напечатаетвсе 8 битов, даже если старшие биты равны нулю.

void printbincharpad(char c)
{
    for (int i = 7; i >= 0; --i)
    {
        putchar( (c & (1 << i)) ? '1' : '0' );
    }
    putchar('\n');
}

printbincharpad (10) запишет в консоль

    00001010

Теперь я представляю функцию, которая печатает всю строку(без последнего нулевого символа).

void printstringasbinary(char* s)
{
    // A small 9 characters buffer we use to perform the conversion
    char output[9];

    // Until the first character pointed by s is not a null character
    // that indicates end of string...
    while (*s)
    {
        // Convert the first character of the string to binary using itoa.
        // Characters in c are just 8 bit integers, at least, in noawdays computers.
        itoa(*s, output, 2);

        // print out our string and let's write a new line.
        puts(output);

        // we advance our string by one character,
        // If our original string was "ABC" now we are pointing at "BC".
        ++s;
    }
}

Однако учтите, что в itoa не добавляются нули-заполнители, поэтому printstringasbinary ("AB1") выведет что-то вроде:

1000001
1000010
110001
2 голосов
/ 23 октября 2011

Ваш код очень расплывчатый и непонятный, но я могу предоставить вам альтернативу.

Прежде всего, если вы хотите, чтобы temp прошел всю строку, вы можете сделать что-то вроде этого:

char *temp;
for (temp = your_string; *temp; ++temp)
    /* do something with *temp */

Термин *temp как условие for просто проверяет, достигли ли вы конца строки или нет.Если у вас есть, *temp будет '\0' (NUL), а for заканчивается.

Теперь внутри for вы хотите найти биты, составляющие *temp.Допустим, мы печатаем биты:

for (as above)
{
    int bit_index;
    for (bit_index = 7; bit_index >= 0; --bit_index)
    {
        int bit = *temp >> bit_index & 1;
        printf("%d", bit);
    }
    printf("\n");
}

Чтобы сделать его немного более общим, то есть преобразовать любой тип в биты, вы можете изменить bit_index = 7 на bit_index = sizeof(*temp)*8-1

1 голос
/ 08 мая 2018
unsigned char c;

for( int i = 7; i >= 0; i-- ) {
    printf( "%d", ( c >> i ) & 1 ? 1 : 0 );
}

printf("\n");

Объяснение:

При каждой итерации самый старший бит читается из байта путем его сдвига и двоичного сравнения по сравнению с 1.

ДляНапример, давайте предположим, что входное значение равно 128, а двоичное значение переводится в 1000 0000. Сдвиг его на 7 даст 0000 0001, поэтому он приходит к выводу, что самый старший бит равен 1. 0000 0001 & 1 = 1. Это первый бит для печатив консоли.Следующие итерации приведут к 0 ... 0.

...