问题描述:
实现一个函数,输入为长度为三的 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为例:
-
红色分量:
- 192 的二进制表示是
11000000
- 左移16位后:
110000000000000000000000
- 192 的二进制表示是
-
绿色分量:
- 192 的二进制表示是
11000000
- 左移8位后:
000000001100000000000000
- 192 的二进制表示是
-
蓝色分量:
- 192 的二进制表示是
11000000
- 保持不变:
000000000000000011000000
- 192 的二进制表示是
使用按位或操作符 |
将这三个二进制数组合起来:
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;
}