字节数组和按位运算符

时间:2018-02-10 06:57:01

标签: c++ c bit-manipulation bitwise-operators avr

我试图读取字节数组的各个位。我基本上是遍历字节数组,想知道每个位是0还是1。

我的问题是,我无法区分0和1位。代码总是将每个位读为1。

这是我的代码:

const unsigned char bitmap[] = {
    0x00,0xFF,0xFF,0x00,0x00,0x00,
    0x00,0x00,0xFF,0xFF,0xFF,0xFF,
    0xFF,0xFF,0xFF,0xFF
};

void drawBitmap(Framebuffer *fb) {

    uint8_t x = 1;
    for (int i = 0; i < sizeof(bitmap); ++i) {
        for (int p = 0; p < 8; ++p) {
            if ((bitmap[i] >> p) & 1) { // If bit
                fb->drawPixel(x, 1); // **RIGHT HERE** --> I AM ALWAYS GETTING THIS AS TRUE 
            }
            x++;
        }
    }
}

请注意,有些字节应该全为零(0x00)。我默认假设这些是字节(8位),对吗?任何想法为什么我无法区分1和0?

注意:这里是整个代码......我正在尝试使用这个库:https://github.com/tibounise/SSD1306-AVR和atmega328P ...这只是没有任何意义。每当我使用&#34; fb-&gt; drawPixel(x,1);&#34;在它自己的工作正常,但在这个特定的功能,我总是得到一个&#34; 1&#34; (一个像素)。

#define F_CPU 14745600

#include <stdint.h>
#include <stdio.h>
#include <math.h>

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <inttypes.h>
#include <util/delay.h>

//#include "SSD1306.h"
#include "Framebuffer.h"

const unsigned char bitmap[] = {
    0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0xFF,0xFF,0xFF,0xFF,
    0xFF,0xFF,0xFF,0xFF
};


void drawBitmap(Framebuffer *fb) {

    uint8_t x = 1;
    int z = 0;
    for (int i = 0; i < sizeof(bitmap); ++i) {
        for (int p = 0; p < 8; ++p) {
            if ((bitmap[i] >> p) & 1) { // If bit
                fb->drawPixel(x,1);             
            }
            x++;
        }
    }

}


int main(void) {


    //const uint8_t *bitmap;
    //bitmap = &bitmap1;

    Framebuffer fb;
    Framebuffer *FB;

    //Pointer to the class
    FB = &fb;

    //fb.drawPixel(5, 5);

    drawBitmap(FB);

    fb.show();

    //delay_ms(1000);


    return 0;
}

有什么想法吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

您的代码似乎没问题。但是,您的样本数据以字节为单位,而不是位。

如果使用1位位图,则每像素有8位。每个位都是01(黑色或白色)。每组8位都压缩为字节:

0xFF包含8位:"11111111"
0x00包含8位:"00000000"

实际位图可能具有以下顺序:

"1011 0001"

使用更真实的数据尝试相同的代码:

const unsigned char bitmap[] = 
{
    1 | 0 | 4 | 8 | 0 | 0 | 0 | 128,//1011 0001 <- first 8-bits
    0xFF, //<- second set of 8-bits
    0x00, //...
};

int main(void)
{
    for(int i = 0; i < sizeof(bitmap); ++i)
    {
        printf("%3d ", bitmap[i]);
        for(int p = 0; p < 8; ++p)
            printf(((bitmap[i] >> p) & 1) ? "1" : "0");
        printf("\n");
    }

    return 0;
}

结果:

141 10110001
255 11111111
  0 00000000