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

标签 c algorithm loops binary char

我有这个结构,它代表一个像素及其三个8位 block 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';
    }
  }
}

这看起来根本没有效率。如果可能的话,我想用几行代码来完成。

最佳答案

我正在解决您问题中的两点 - 迭代速度以及您所说的“删除最后一位”。

第一点——研究“union”。 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 - 我希望这有帮助!

关于c - 在多个循环环境中迭代三个值的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46980755/

相关文章:

database - 将唯一代码插入数据库的更好方法

C - 段错误 : 11

c - 从函数传递 scanf 字符串

database - AVL 树与平衡树

algorithm - 带有访问后排序的图形上的迭代DFS

c - 返回 C 中数组中包含特定值的所有索引位置

c - 如何使用 SECCOMP_RET_DATA 和 PTRACE_GETEVENTMSG 获取系统调用的返回码

c - MinGW 库问题

c++ - 寻找最小的下一个更大的元素

java - 这些嵌套循环的大 O