迭代char数组,打印每个char的位(在C中)

时间:2012-04-28 19:08:35

标签: c char bit-shift

尝试打印出存储在数组中的每个char的位。我查了一些代码并尝试了一个版本以满足我的需求。问题是我似乎只是获得数组中的第一个字符。

//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正在做什么。我发现在其他人的代码中,我不确定。

3 个答案:

答案 0 :(得分:7)

你错过了

                   char_to_print >>= 1;

char_to_print未移位并已保存

你应该每次使用新的char_to_print初始化位

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

答案 1 :(得分:3)

  

“有人可以告诉我”&amp; 0x01“正在printf中   语句“

这就是你获得每个数字的方式。数字向下移1,按位与1进行1运算.1仅设置1位,* L *东* S *为1,因此与此相关将产生1(如果char_to_print也有LSB设置)或零,如果没有。

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

答案 2 :(得分:1)

有两个问题:

  1. char_to_print >> 1;正在进行位移,但丢掉了结果。试试char_to_print = char_to_print >> 1;

  2. 您无法将char传递给期望整数的printf。你应该(int)(char_to_print & 0x01)