在多循环环境中迭代三个值的最有效方法

时间:2017-10-27 17:45:31

标签: c algorithm loops binary char

我有这个结构代表一个像素,其三个8位块R,G,B

typedef struct pixel_st {
    uint8_t r, g, b;
} pixel_t;

pixel_t *array_of_pixels; // array of pixels

问题是,给定一个具有大量像素的数组,什么是迭代R,G和B并删除它们的最后一位的最有效方法迭代文件,并通过其字符'位

这个问题可能不太清楚,在代码中这基本上就是我想做的事情:

For each character in file {
    For each bit in character (its 7 last bits) {
        change next color r, g or b of current pixel, 
        if all colors of pixel have been changed 
            go to next pixel
    }
}

以下是我的尝试:

// iterators
char ch; // text file characters
pixel_t *pixel_iterator = array_of_pixels; // image pixels
uint8_t *r, *g, *b, i; // pixel colors
char last = ' ';

while((ch = getc(f)) != EOF) { // iterate through characters
  for(i = 0; i < 7; i++) { // character size in ASCII
    if(last == 'b' || last == ' ') { // first iteration, or last was b => go to r
      if(last == 'b') { // go to next pixel
        pixel_iterator++;
      }
      r = pixel_iterator->r >> 1;
      r << 1;
      last = 'r';
    } else if(last == 'r') { // go to g
      g = pixel_iterator->r >> 1;
      g << 1;
      last = 'g';
    } else if(last == 'g') { // go to b
      b = pixel_iterator->r >> 1;
      b << 1;
      last = 'b';
    }
  }
}

这看起来效率不高。如果可能的话,我想在几行内完成。

1 个答案:

答案 0 :(得分:1)

我正在解决你的问题中的两点 - 迭代速度和你说“删除最后一位”的地方。

第一点 - 研究“联盟”。 union允许您覆盖结构但将其视为不同的内存布局。在您的特定情况下,您可以将3x8位值视为单个24位值。

然后你一次读3个字节。

当你开始把事物想象成一个24位的值时,很容易删除“最后”的位...某些伪代码:

char[3] bytes = {}

long v = bytes[0]<<16 | bytes[1] << 8 | bytes[2]
long out = v & 0b111111101111111011111110
bytes[0] = out >> 16
bytes[1] = out >> 8
bytes[2] = out

注意 - 这是伪代码 ---请不要语法批评:)

@paul - 我希望这有帮助!