2

试图打印出存储在数组中的每个字符的位。我查找了一些代码并尝试了一个适合我需要的版本。问题是我似乎只得到了数组中的第一个字符。

//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。我在别人的代码中发现了这一点,我不确定。

4

3 回答 3

7

你错过了

                   char_to_print >>= 1;

char_to_print 未移动并保存

而且您应该每次都使用新的 char_to_print 初始化位

            for (bit = 0; bit < 8; bit++)
于 2012-04-28T19:11:54.477 回答
3

“有人能告诉我 printf 语句中的“& 0x01”在做什么吗?

这就是你如何得到每个数字。数字向下移动 1,并与 1 进行按位与运算。1 仅设置了一个位,即 *L*east *S* 重要的一个,因此与它进行与运算将产生 1(如果char_to_print还设置了 LSB)或零,如果没有。

因此,例如,如果char_to_print最初是 4,则第一次与 1 进行与运算会产生零,因为未设置 LSB。然后它向下移动一个并与,另一个零。第三次,设置了 LSB,所以你得到 1。二进制 100 是十进制 4。

于 2012-04-28T19:17:32.297 回答
1

有两个问题:

  1. char_to_print >> 1;正在做位移,但丢弃了结果。尝试char_to_print = char_to_print >> 1;

  2. 您不能将 a 传递charprintf期望整数。你应该(int)(char_to_print & 0x01)

于 2012-04-28T19:14:26.683 回答