题目

位域或掩码:用 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