题目
位域或掩码:用 unsigned 存 RGB 分量
思路
本题把 RGB 三个 0~255 的分量打包进一个整数,并能解包还原。
打包:color = (r<<16)|(g<<8)|b;解包:用移位和掩码取出各字节。写入前先 clamp 到 0~255。
解题分析
RGB 各 8 位打包:(r<<16)|(g<<8)|b,解包用移位和 &0xFF。输出十六进制便于肉眼检查位布局。
完整程序
#include <stdio.h>
int main(void)
{
unsigned r, g, b;
if (scanf("%u %u %u", &r, &g, &b) != 3) {
return 1;
}
unsigned pack = (r << 16) | (g << 8) | b;
printf("0x%06X\n", pack & 0xFFFFFF);
unsigned r2 = (pack >> 16) & 0xFF;
unsigned g2 = (pack >> 8) & 0xFF;
unsigned b2 = pack & 0xFF;
printf("%u %u %u\n", r2, g2, b2);
return 0;
}
运行示例
输入:
255 128 0输出:
0xFF8000
255 128 0