c++修剪并填充十六进制的无符号int,用于#RGB值
c++ trim and pad unsigned int in hexadecimal for #RGB value
给定一个无符号整数,我需要得到一个6位数长的十六进制值。
- 81892(十六进制:13FE4),应变为13FE40或013FE4
- 3285446057(十六进制:C3D3EDA9),应变为C3D3ED或D3EDA9
由于我参与的项目使用了Qt,我通过以下方式解决了问题:
unsigned int hex = qHash(name);
QString hexStr = (QString::number(hex, 16) + "000000").left(6);
bool ok;
unsigned int hexPat = hexStr.toUInt(&ok, 16);
这会将十六进制数字字符串填充在右侧,然后在左侧第六个字符后对其进行修剪。相反,我会简单地替换第二行:
QString hexStr = ("000000" + QString::number(hex, 16)).right(6);
该值将用于RGB值,这就是为什么我需要六个十六进制数字(0到255之间的三个值)。
有没有一种更有效的方法可以在不转换为字符串然后返回的情况下实现这两种结果中的一种(或两种)?
问题的实际要求是给定一个无符号整数,您需要提取三个字节
确实不需要转换为字符串来提取它们,使用位操作可以更有效地执行。
要从整数中提取任何字节,请右移(>>
)相应的位数(0、8、16或24),并用只取最右边字节的掩码(0xFF
,实际上是0x000000FF
)对结果进行AND
。
例如,取三个最低有效字节:
uint c = hash(...);
BYTE r = (BYTE)((c >> 16) & 0xFF);
BYTE g = (BYTE)((c >> 8) & 0xFF);
BYTE b = (BYTE)(c & 0xFF);
或三个最高有效字节:
uint c = hash(...);
BYTE r = (BYTE)((c >> 24) & 0xFF);
BYTE g = (BYTE)((c >> 16) & 0xFF);
BYTE b = (BYTE)((c >> 8) & 0xFF);
相关文章:
- 运算符 += 应用于 std::valarray<int*>
- C ++ txt 文件成数组逐行字符串和 int 用于纸牌游戏
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 为什么基于 int 的访问不适用于 std::get(std::tuple)?
- 正确语法,用于统一初始化名称中带有空格的类型的临时,如unsigned int
- 如何证明 -> 在 int* pMember = &(pSomeType->SomeIntMember) 时不用于顺从;
- 用于检查"is int"/"is double"/等的模板函数
- sqlite3 更改函数回调参数 void* not用于 int* C++
- 为什么现代C 仍然保留旧的C样式原型,用于int argc,char ** argv
- 是否有任何用于ConstexPR操作员 (INT)的应用程序(INT)
- 双指针 (int**) 和双括号,用于从 2D 数组中获取值
- OpenCL 的 clEnqueueReadBufferRect 适用于 int 但不适用于 double 数据类型
- 使用4用于循环的4矩阵上的数组下标的“ int [int]类型”
- 检测输入键的输入键,用于INT类型
- 无法获得 boost::spirit parser&lexer 适用于 std::string 或 int 或 double 以外的令牌类型
- map(long long int,long long int)不适用于key=1000 000 000(在long l
- Qt警告:正在传递用于转换QRect的qreal::QRect(int,int,int)
- 重载分辨率如何适用于 std::vector:<int>:insert
- C 不是运算符应用于 int
- 无法将向量<int>转换为 int* 用于布尔测试密码