题目
使用位运算将 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