2

只是对某事感到好奇。在将 HTML 颜色(其单个颜色分量通过 2 位十六进制值表示)转换为 0.0 到 1.0 之间的浮点数以便我们可以将它们与 OpenGL 一起使用时,我开始好奇一些事情。我们必须将十六进制值除以 255 才能得到对应的 OpenGL 值,但我们不能简单地按原样使用十六进制值,因为这会产生整数除法。

现在我知道这些都可以解决这个问题(当然)......

float r = 0xFD / (float)0xFF; // Works because of the cast to float

float r = 0xFD / 255.0f;      // Works because of the explicit float 

float d = 0xFF;
float r = 0xFD / d;           // Works because 'd' is a float 

...但我想知道是否有任何方法可以仅装饰十六进制值,以便将其解释为浮点数(就像您在 1.0f 中使用“f”一样),而无需进行强制转换、计算或临时变量。

这些当然不行……

float r = 0xFD / 0xFF;   // Integer division yields an integer, not float

float r = 0xFD / 0xFFf;  // Interprets 'f' as part of the hex value

同样,不要试图找出如何实现我需要的结果,因为我的代码工作得很好。我只是想知道我是否可以通过使用类似于'f'如何处理十进制值而不是使用上述三种有效的方法来装饰十六进制值来使代码更清晰。

4

4 回答 4

1

这可能在 c++0x 中使用用户定义的文字是可能的,但我怀疑在 c++03 中是否有任何巧妙的方法可以做到这一点。

于 2011-08-04T10:26:39.557 回答
0

我不知道有什么方法可以完全按照您的要求进行操作,但是如果您要反复使用 0xFF ,为什么不将其设置为常数呢?那仍然会保留打字,即:

const float divisor = 0xFF
float r = 0xFD / divisor

我认为这可以解决您要解决的问题,即使方式不完全相同。

于 2011-08-01T23:30:54.723 回答
0

一种方法是定义自己的模式来定义十六进制浮点数, 0xff 定义十六进制整数,您可以制作一个宏,例如:

#define 0y (float) 0x

然后你就写

float r = 0xAF / 0yFF;

做你的浮动部门。

尽管此解决方案可能会给阅读您的代码的其他人造成混乱,但如果代码主要是为您准备的,那么您可以这样做

于 2011-08-02T07:15:46.673 回答
0

恐怕您必须使用预处理器定义才能获得最佳外观。而且您还需要强制转换来执行您的计算。

我能想到的最好的解决方案是

#define COMPONENT8(value) ((float)(value) / 255.0f))

浮点值不能指定为十六进制(整数)值。

于 2011-08-03T15:52:06.437 回答