如何“更优雅地”生成24位RGB值?

时间:2014-05-29 03:45:02

标签: c algorithm rgb

源文件:

/* gcc <filename.c> -o <filename> -std=c99 -Wall */

#include <stdio.h>

int main (void)
{
  unsigned int RGB[8];
  for (unsigned char Cnt = 1; Cnt < 8; Cnt++)
  {
    RGB[Cnt] =   ((unsigned int)((6+Cnt)/7)) * (((unsigned int) 0xFF) << (8*((9-Cnt)%3)))
               + ((unsigned int) (Cnt/4))    * (((unsigned int) 0xFF) << (8*((8-Cnt)%3)))
               + ((unsigned int) (Cnt/7))    *  ((unsigned int) 0xFF);
    fprintf (stdout, "%06X\n", RGB[Cnt]);
  }
}

输出:(顺序:R - > G - > B - > R + G - > G + B - > B + R - > R + G + B )

  

FF0000

     

00FF00

     

0000FF

     

FFFF00

     

00FFFF

     

FF00FF

     

FFFFFF

我想知道......

  • 是否有更优雅的方法可以按此顺序生成

  • 这些类型铸件是否必须 ISO C99

  • 在这种情况下,类型转换中的无符号符号是否必须 ISO C99

感谢。

2 个答案:

答案 0 :(得分:2)

简单的方法就是硬编码值,它很容易阅读。

无论如何你想要生成它们 - 这个变体既不比整数除法更快:

unsigned int RGB[7];
unsigned int values[] = {0, 0xff};
unsigned int rgbmask = 0x1EBC54; // binary 111101011110001010100
for (int i=0; i<7; i++)
{
    RGB[i] = values[rgbmask>>2&1]<<16 | values[rgbmask>>1&1]<<8 | values[rgbmask&1];
    rgbmask >>= 3;
    printf ("%06X\n", RGB[i]);
}

答案 1 :(得分:2)

可能不是你想看的东西,但这似乎好多了:

unsigned int RGB[8] = {
    0x000000,
    0xFF0000,
    0x00FF00,
    0x0000FF,
    0xFFFF00,
    0x00FFFF,
    0xFF00FF,
    0xFFFFFF
};