我有这个结构代表一个像素,其三个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';
}
}
}
这看起来效率不高。如果可能的话,我想在几行内完成。
答案 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 - 我希望这有帮助!