c++修剪并填充十六进制的无符号int,用于#RGB值

c++ trim and pad unsigned int in hexadecimal for #RGB value

本文关键字:int 用于 #RGB 无符号 修剪 填充 十六进制 c++      更新时间:2023-10-16

给定一个无符号整数,我需要得到一个6位数长的十六进制值。

  • 81892(十六进制:13FE4),应变为13FE40013FE4
  • 3285446057(十六进制:C3D3EDA9),应变为C3D3EDD3EDA9

由于我参与的项目使用了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);