源文件:
/* 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
我想知道......
是否有更优雅的方法可以按此顺序生成的
这些类型铸件是否必须
在这种情况下,类型转换中的无符号符号是否必须
感谢。
答案 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
};