题目

使用位运算将 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;。

完整程序

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int r = sc.nextInt();
        int g = sc.nextInt();
        int b = sc.nextInt();

        // 移位打包:RGB 打包成 24/32 位整数
        int color = ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF);
        System.out.printf("0x%06X%n", color);

        // 移位掩码解包
        int outR = (color >> 16) & 0xFF;
        int outG = (color >> 8) & 0xFF;
        int outB = color & 0xFF;
        System.out.printf("%d %d %d%n", outR, outG, outB);
    }
}

运行示例

输入:

255 128 0

输出:

0xFF8000
255 128 0