C++刷题:RGB色值转Integer

问题描述:

实现一个函数,输入为长度为三的 rgb 字符串,返回为十六进制 HEX 格式字符串。

输入格式:字符串

输出格式:数字

输入样例:

"rgb(192, 192, 192)"

输出样例:

12632256

问题分析:

        首先要进行字符串的处理。输入"rgb(192,192,192)",想办法将三个192提取出来,再将192192192转化为十六进制。在C++中,字符串自带截取方法substr(),然后利用istringstream提取三个数字,并放入一个vector中。istringstraem具体用法参考:【C++】stringstream类 最全超详细解析

        下面将三个三位数转化为16进制数。C++中,<<与>>分别代表左移与右移,而 | 则代表按位或运算,可以将两段二进制数拼在一起。经过上面的字符串处理后,vector<int> values中存储了三个数字,分别是:r:values[0],g:values[1],b:values[2]。

        根据RGB颜色系统,每种颜色分量占8位二进制位。因此,values[2]应该在最低8位,values[1]在次8位,values[0]在最高八位。因此,可以将values[0]左移16位,values[1]左移8位,values[2]保持不变,然后使用 | 将三个二进制串连接起来,就是最终的二进制串。以192,192,192为例:

  1. 红色分量

    • 192 的二进制表示是 11000000
    • 左移16位后:110000000000000000000000
  2. 绿色分量

    • 192 的二进制表示是 11000000
    • 左移8位后:000000001100000000000000
  3. 蓝色分量

    • 192 的二进制表示是 11000000
    • 保持不变:000000000000000011000000

使用按位或操作符 | 将这三个二进制数组合起来:

110000000000000000000000  // 红色分量
000000001100000000000000  // 绿色分量
000000000000000011000000  // 蓝色分量
-------------------------
110000001100000011000000  // 组合后的32位整数

 最后得到的二进制串即为目标十六进制数。完整代码实现:

#include <iostream>
#include <string>
#include <vector>
#include <sstream>

int solution(std::string rgb) {
    //去除 "rgb(" 和 ")",并用逗号分割字符串
    std::string trimmed = rgb.substr(4, rgb.size() - 5);
    std::istringstream iss(trimmed);
    std::vector<int> values;
    int value;

    //读取每个颜色分量
    while (getline(iss, trimmed, ',')) {
        std::istringstream(trimmed) >> value;
        values.push_back(value);
    }

    //计算十六进制颜色值
    int hexValue = (values[0] << 16) | (values[1] << 8) | values[2];

    return hexValue;

}

int main() {
    //  You can add more test cases here
    std::cout << solution("rgb(192, 192, 192)") << std::endl;
    std::cout << solution("rgb(100, 0, 252)") << std::endl;
    std::cout << solution("rgb(33, 44, 55)") << std::endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值