将RGB转换为十六进制 | 豆包MarsCode AI刷题

124 阅读4分钟

在现代网页设计与图形处理应用中,颜色的表示方式是至关重要的。在许多开发环境中,颜色通常用RGB(红绿蓝)值来表示,而在网页开发中,十六进制(HEX)颜色码则更加常见。在本篇文章中,我们将通过一个简单的算法题,来探索如何将RGB格式的颜色字符串转换为十六进制的颜色代码。

问题描述

题目要求我们编写一个函数,输入为长度为三的RGB字符串,返回其对应的十六进制颜色值。RGB颜色值的格式通常为rgb(红色, 绿色, 蓝色),每个颜色分量的值范围在0到255之间。例如,输入字符串"rgb(192, 192, 192)"应返回12632256,即#C0C0C0的十六进制形式。

问题分析

我们面临的核心问题是如何将RGB格式的字符串转换为一个十六进制的数字。RGB每个颜色分量(红、绿、蓝)的值可以通过位移操作合并为一个32位整数。具体来说,红色值会被左移16位,绿色值左移8位,而蓝色值保持在低8位。通过这种位移方式,三者的数值便能够拼接成一个十六进制的颜色代码。

思路与步骤

  1. 解析RGB字符串:首先我们需要从输入的字符串中提取出RGB的三个颜色分量。字符串的格式通常是"rgb(数字, 数字, 数字)",其中每个数字表示一个颜色分量。
  2. 字符串处理:去掉字符串中的"rgb(")符号,得到纯数字部分。然后根据逗号分割字符串,得到三个颜色分量。
  3. 转换为整数:将提取出的红、绿、蓝三个分量转换为整数类型,并按顺序合并成一个十六进制的整数。
  4. 返回十六进制结果:最后,我们将合并后的整数作为十六进制值返回。

图解

假设输入为"rgb(192, 192, 192)",我们来一步步拆解。

  1. 输入字符串"rgb(192, 192, 192)"

  2. 去掉"rgb(") :去掉之后剩下的字符串为"192, 192, 192"

  3. 分割字符串:通过逗号分割,得到三个部分:"192", "192", "192"

  4. 转换为整数:将这些部分转换为整数:red = 192, green = 192, blue = 192

  5. 合并为十六进制

    • 红色分量192(十进制)左移16位:192 << 16 = 12582912
    • 绿色分量192(十进制)左移8位:192 << 8 = 49152
    • 蓝色分量192(十进制)保持不变:192
  6. 合并并返回

    • 最终合并结果为:12582912 + 49152 + 192 = 12632256

因此,RGB颜色rgb(192, 192, 192)对应的十六进制数为12632256

代码详解

public class Main {
    public static int solution(String rgb) {
        // 去掉字符串中的 "rgb(" 和 ")"
        rgb = rgb.replaceAll("[rgb() ]", "");
        // 按逗号分割字符串
        String[] parts = rgb.split(",");
        if (parts.length != 3) {
            throw new IllegalArgumentException("Invalid RGB format");
        }

        // 将RGB三个分量转为整数
        int red = Integer.parseInt(parts[0]);
        int green = Integer.parseInt(parts[1]);
        int blue = Integer.parseInt(parts[2]);

        // 计算十六进制数值
        return (red << 16) | (green << 8) | blue;
    }

    public static void main(String[] args) {
        // 测试用例
        System.out.println(solution("rgb(192, 192, 192)") == 12632256);  // 输出: true
        System.out.println(solution("rgb(100, 0, 252)") == 6553852);     // 输出: true
        System.out.println(solution("rgb(33, 44, 55)") == 2174007);     // 输出: true
    }
}

代码解析

  1. 输入字符串处理

    • replaceAll("[rgb() ]", ""):去除字符串中的"rgb(")和空格,只留下纯数字。
  2. 分割并提取颜色分量

    • split(","):将字符串按逗号分割成一个数组,其中每个元素对应RGB中的一个颜色分量。
  3. 将字符串转换为整数

    • Integer.parseInt(parts[i]):将分割后的每个颜色分量转换为整数,分别赋给redgreenblue
  4. 位运算合并RGB值

    • (red << 16):将红色分量左移16位,相当于将红色分量放到十六进制数的高16位。
    • (green << 8):将绿色分量左移8位,放到十六进制数的中间8位。
    • blue:蓝色分量直接放到低8位。
    • |:使用按位或运算符将三个颜色分量合并为一个整数。
  5. 返回结果

    • 函数最终返回合并后的十六进制数值。

结语

通过以上的步骤与代码详解,我们成功地将RGB颜色字符串转换为对应的十六进制颜色代码。通过位移和按位或操作,我们有效地合并了RGB的各个分量,得到了最终的十六进制数字。这种处理方法在图形编程、网页开发等领域中都非常常见,希望本文能帮助你更好地理解这一转换过程。