2012-04-28 4 views
2

Попытка распечатать бит каждого символа, хранящегося в массиве. Я просмотрел код и попробовал версию, соответствующую моим потребностям. Проблема в том, что я только, кажется, получаю первый символ в массиве.Итерация через массив символов, печать бит каждого символа (в C)

//read_buffer is the array I want to iterate through, bytes_to_read is the number of 
//index positions I want to_read. (array is statically allocated and filled using read() 
//funct, therefore there are some garbage bits after the char's I want), bytes_to_read 
//is what's returned from read() and how many bytes were actually read into array 
void PrintBits(char read_buffer[], int bytes_to_read) 
{ 

     int bit = 0; 
     int i = 0; 
     char char_to_print; 

     printf("bytes to read: %d\n", bytes_to_read); //DEBUG 

     for (; i < bytes_to_read; i++) 
     { 
       char_to_print = read_buffer[i]; 

       for (; bit < 8; bit++) 
       { 
         printf("%i", char_to_print & 0X01); 
         char_to_print >> 1; 
       } 
       printf(" "); 
       printf("bytes_to_read: %d -- i: %d", bytes_to_read, i); 
     } 

     printf("\n"); 
} 

В основном, что я получаю: 00000000 Не знаю, почему это так. Благодаря отладке я обнаружил, что он только печатает первый бит и ничего больше. Я также доказал, что внешний цикл на самом деле повторяется через int от 0 до 29 ... Так что это должно быть итерация через char в массиве. Я в тупике.
* Кроме того, может кто-нибудь сказать мне, что делает «& 0x01» в инструкции printf. Я обнаружил это в чужом коде, и я не уверен. Lol ... может быть, это моя проблема?

ответ

7

Вы пропустили, что

    char_to_print >>= 1; 

char_to_print не был перенесен и сохранен

И вы должны инициализировать Бит каждый раз с новым char_to_print

  for (bit = 0; bit < 8; bit++) 
+0

Удивительный второй набор глаз, спасибо. Я обычно инициализирую все в своих циклах на C++, но с C Я пытался что-то другое и не думал о эффектах. БЛАГОДАРЮ. – MCP

1

Есть две проблемы:

  1. char_to_print >> 1; выполняет бит-сдвиг, но отбрасывает результат. Попробуйте char_to_print = char_to_print >> 1;

  2. Вы не можете передать char в printf, ожидая целого числа. Вы должны (int)(char_to_print & 0x01).

3

"кто-то может сказать мне, что" & 0x01" делает в PRINTF заявление»

Вот как вы получите каждую цифру. Число сдвинуто вниз 1, а побитовое значение AND с 1. 1 имеет только один бит, * L * east * S * - новый, поэтому AND'ing с этим будет давать либо 1 (если char_to_print также имеет набор LSB) или ноль, если это не так.

Так, например, если char_to_print - это 4 изначально, то в первый раз это ANDed с 1 дает нуль, потому что LSB не установлен. Затем он сдвигается вниз на один, а другой - на другой. В третий раз устанавливается LSB, поэтому вы получаете 1. Двоичный 100 десятичный. 4.

+0

А, я не поймал побитую операцию. Я думаю, что шестнадцатеричный номер немного меня бросил, но теперь это имеет смысл. Спасибо за это разъяснение. – MCP

Смежные вопросы