题目

使用位运算将 0~255 范围内的红(R)、绿(G)、蓝(B)三个单字节颜色分量打包进一个 32 位无符号整型 unsigned int 中,并演示逆向解包还原各分量。

输入格式:一行输入三个整数 r g b,以空格分隔(0 ≤ r, g, b ≤ 255)。

输出格式:第一行输出打包后的十六进制数值(格式形如 0xRRGGBB);第二行输出解包验证还原后的 r, g, b 分量。

数据范围与约定:0 ≤ r, g, b ≤ 255。

思路与算法

1. 移位与按位或打包
高位左移腾出空间后按位或组合:color = (r << 16) | (g << 8) | b;。

2. 右移与掩码解包
通过逻辑右移对齐到最低字节,再与掩码 0xFF 进行按位与操作提取该分量:r = (color >> 16) & 0xFF;。

完整程序

#include <stdio.h>

int main(void)
{
    unsigned r, g, b;
    if (scanf("%u %u %u", &r, &g, &b) != 3) {
        return 1;
    }

    // 位拼装:R 占高 16 位,G 占中 8 位,B 占低 8 位
    unsigned pack = (r << 16) | (g << 8) | b;
    printf("0x%06X\n", pack & 0xFFFFFF);

    // 位拆解:通过右移加掩码 & 0xFF 提取各单通道颜色分量
    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