Различия между 0x01 и 0x01f - PullRequest
       38

Различия между 0x01 и 0x01f

3 голосов
/ 09 августа 2010

Я смотрю на оригинальный исходный код для идентификаторов. Есть немного кода, который немного вертится, чтобы извлечь красный, зеленый и синий компоненты:

int blue = (code >> 16) & 0x01f;
int green = (code >> 21) & 0x01f;
int red = (code >> 27) & 0x01f;

Переменная кода представляет собой 32-разрядное целое число.

У меня такой вопрос: в чем разница между числом 0x01 и 0x01f?

Я предполагаю, что f означает, что значение является float, но зачем делать это float? Это то, что представление с плавающей точкой в ​​двоичном формате отличается от целочисленного представления? Не приведет ли это к проблемам по переносимости при переносе, если конкретный язык не использует то же представление?

Кроме того, я, вероятно, читаю это неправильно из-за непонимания проблемы 0x01f, но разве это не просто установка красного, зеленого и синего представлений в 0 или 1, в зависимости от младшего значащего бита?

Ответы [ 3 ]

10 голосов
/ 09 августа 2010

Это не имеет ничего общего с поплавками.Это битовая маска.

0x01f = 0b11111

Когда вы & набираете свой номер, он очищает все биты слева от 5-го бита справа.

Вот как 0x0a2bfb & 0x01f => 0x00001b:

0x0a2bfb : 0000 1010 0010 1011 1111 1011
0x01f    : 0000 0000 0000 0000 0001 1111 &
----------------------------------------
result   : 0000 0000 0000 0000 0001 1011
3 голосов
/ 09 августа 2010

Я не уверен насчет Java, но в C99 шестнадцатеричные числа с плавающей точкой действительно существуют , и они выглядят так:

0x50.1p3

Суффикс p является обязательным (и используется для обозначения степени 2, чтобы поднять число).Следовательно, нет никакой двусмысленности с шестнадцатеричными целочисленными литералами как 0x01f.Компилятор не примет f за постоянный суффикс с плавающей точкой, он будет читать его как шестнадцатеричное число.

2 голосов
/ 09 августа 2010

f в шестнадцатеричном контексте - это , а не с плавающей точкой. 0xf эквивалентно десятичному значению 15.

В вашем примере код находит младшие 5 бит цветового кода, вероятно, в 15 или 16-битном цветовом пространстве

...