2

何かに興味があるだけです。OpenGL で使用できるように、HTML の色 (個々の色コンポーネントは 2 桁の 16 進数値で表されます) を 0.0 から 1.0 の間の浮動小数点数に変換しているときに、あることに気付きました。16 進数値を 255 で除算して対応する OpenGL を取得する必要がありますが、整数除算が生成されるため、16 進数値をそのまま使用することはできません。

これで、これらすべてがこの問題を回避できることがわかりました(もちろん)...

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 

...しかし、キャスト、計算、または中間変数を実行する必要なく、16 進数値を浮動小数点数として解釈する方法があるかどうか疑問に思っていました (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

繰り返しますが、コードが正常に機能するため、必要な結果を達成する方法を見つけようとはしません。上記の 3 つの方法を使用する代わりに、16 進値を「f」が 10 進値でどのように機能するかに似たもので装飾することで、コードをよりきれいにすることができるかどうか疑問に思っています。

4

4 に答える 4

1

これは、ユーザー定義のリテラルを使用して c++0x で可能になる可能性がありますが、c++03 でそれを行う適切な方法があるとは思えません。

于 2011-08-04T10:26:39.557 に答える
0

見栄えを良くするには、プリプロセッサ定義を使用する必要があります。また、計算を実行するためにキャストする必要もあります。

私が考えることができる最善の解決策は

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

浮動小数点値は、16進(整数)値として指定することはできません。

于 2011-08-03T15:52:06.437 に答える
0

あなたが求めていることを正確に行う方法はわかりませんが、0xFF を繰り返し使用する場合は、定数として設定してみませんか? それはまだタイピングを保持します、すなわち:

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

まったく同じ方法でなくても、解決しようとしている問題を解決できると思います。

于 2011-08-01T23:30:54.723 に答える
0

これを行う 1 つの方法は、独自のパターンを定義して 16 進浮動小数点数を定義することです。0xff は 16 進整数を定義します。次のようなマクロを作成できます。

#define 0y (float) 0x

それからあなたはただ書く

float r = 0xAF / 0yFF;

フロート除算を行います。

この解決策は、コードを読む他の人に混乱を招く可能性がありますが、コードがほとんどあなたのためのものである場合は、この方法で行うことができます

于 2011-08-02T07:15:46.673 に答える