Можете ли вы украсить шестнадцатеричную константу, чтобы она интерпретировалась как число с плавающей точкой? - PullRequest
2 голосов
/ 02 августа 2011

Просто интересно о чем-то. При преобразовании цветов HTML (отдельные цветовые компоненты которых представлены в виде двузначных шестнадцатеричных значений) в значения с плавающей запятой между 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 

... но мне было интересно, есть ли способ просто украсить шестнадцатеричное значение, чтобы оно интерпретировалось как число с плавающей точкой (как вы делаете с 'f' в 1.0f) без необходимости приведения, вычисления или промежуточных переменных.

Это, конечно, не работает ...

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 ]

1 голос
/ 04 августа 2011

Это, вероятно, было бы возможно в c ++ 0x с использованием пользовательских литералов , но я сомневаюсь, что есть какой-нибудь изящный способ сделать это в c ++ 03.

0 голосов
/ 02 августа 2011

Один из способов сделать это - определить собственный шаблон для определения шестнадцатеричных чисел, 0xff - шестнадцатеричные целые числа, вы можете создать макрос, например:

#define 0y (float) 0x

Тогда вы просто напишите

float r = 0xAF / 0yFF;

, чтобы сделать ваше деление поплавка.

Это решение может создать путаницу для тех, кто читает ваш код, но если код в основном для вас, чем вы могли бы сделать это таким образом

0 голосов
/ 03 августа 2011

Боюсь, вы должны использовать определение препроцессора, чтобы добиться наилучшего внешнего вида.И вам также понадобится приведение для выполнения ваших вычислений.

Лучшее решение, которое я могу себе представить, это

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

Значения с плавающей запятой нельзя указывать как шестнадцатеричные (целые) значения.

0 голосов
/ 02 августа 2011

Я не знаю ни одного способа сделать именно то, что вы просите, но если вы хотите использовать 0xFF несколько раз, почему бы не установить его как константу?Это все равно сохранит типизацию, то есть:

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

Я думаю, что это решит проблему, которую вы хотите решить, даже если это не совсем так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...