Преобразование Char в двоичный код в C
Я пытаюсь преобразовать символ в его двоичное представление (так что символ --> ascii hex --> binary).
Я знаю, что для этого мне нужно переложить и AND
. Однако мой код почему-то не работает.
вот что у меня есть. *temp
указывает на индекс в строку c.
char c;
int j;
for (j = i-1; j >= ptrPos; j--) {
char x = *temp;
c = (x >> i) & 1;
printf("%dn", c);
temp--;
}
3 ответов
мы показываем две функции, которые печатают один символ в двоичный.
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
ваш код очень расплывчатый и непонятный, но я могу предоставить вам альтернативу.
прежде всего, если вы хотите temp
чтобы пройти через всю строку, вы можете сделать что-то вроде этого:
char *temp;
for (temp = your_string; *temp; ++temp)
/* do something with *temp */
термин *temp
как for
условие просто проверяет, достигли ли вы конца строки или нет. Если да, то ... --3--> будет ''
(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
to bit_index = sizeof(*temp)*8-1
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.