2012-06-06 2 views
49

Иногда я вижу константы Целочисленности, определенные в шестнадцатеричном, а не десятичные числа. Это небольшая часть я взял из класса GL10:Зачем использовать шестнадцатеричные константы?

public static final int GL_STACK_UNDERFLOW = 0x0504; 
public static final int GL_OUT_OF_MEMORY = 0x0505; 
public static final int GL_EXP = 0x0800; 
public static final int GL_EXP2 = 0x0801; 
public static final int GL_FOG_DENSITY = 0x0B62; 
public static final int GL_FOG_START = 0x0B63; 
public static final int GL_FOG_END = 0x0B64; 
public static final int GL_FOG_MODE = 0x0B65; 

Это, очевидно, проще определить 2914 вместо 0x0B62, так есть, возможно, некоторые выигрыш в производительности? Я вообще не думаю, что с этого момента работа компилятора должна измениться.

+7

Нет ничего об этом - иногда это кодирование, иногда это битмаска, иногда это переменная флага, иногда это просто число – Petesh

+3

А иногда это просто для запутывающих начинающих;) – mallaudin

+0

@mallaudin Начинающие сначала должны изучить основы. Не OpenGl. –

ответ

56

Это, скорее всего, организационная и визуальная чистота. База 16 имеет гораздо более простую связь с двоичным кодом, чем базовое 10, поскольку в базе 16 каждая цифра соответствует точно четырем битам.

Обратите внимание, что в приведенном выше примере константы сгруппированы с несколькими цифрами.Если бы они были представлены в десятичной форме, общие битки были бы менее ясными. Если бы вместо них были десятичные цифры, битовые шаблоны не имели бы такой же степени сходства.

Кроме того, во многих ситуациях желательно иметь возможность побитовых ИЛИ констант вместе создавать комбинацию флагов. Если значение каждой константы ограничено только для того, чтобы иметь только подмножество бит, отличное от нуля, это можно сделать таким образом, который можно разделить. Использование hex-констант позволяет понять, какие биты не равны нулю в каждом значении.

Существуют две другие разумные возможности: восьмеричная или базовая 8 просто кодирует 3 бита на цифру. И тогда есть двоично-кодированное десятичное число, в котором каждая цифра требует четыре бита, но цифровые значения выше 9 запрещены - это было бы невыгодно, поскольку оно не может представлять все возможности, которые могут быть использованы двоичными.

+1

Вы так правы в объединении констант с побитовым ИЛИ ... полностью забыли об этом ... –

9

Считываемость при применении шестнадцатеричного masks, например.

2

Нет усиления производительности.

Однако, если эти константы соответствуют определенным битам внизу, большинство программистов предпочитают Hex (или даже двоичный), чтобы сделать это понятным и читаемым.

Например, можно легко увидеть, что GL_EXP2 имеет 2 бита, 1 бит и 0x0800 бит (что равно 2048 десятичным). Десятичное значение 2049 было бы менее ясным.

+0

Не только это, но некоторые языки программирования не имеют двоичного типа данных, и, как вы сказали, преобразование из двоичного в шестнадцатеричное и обратно намного проще по сравнению с десятичным. 0001 == 1 0010 == 2 0011 == 3 ... 1001 == 9 1010 == A ... 1110 == E 1111 == F. Существует от 4 бит до 1 шестнадцатеричной буквы. Итак, A3 = 10100011 –

8

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

Компьютеры не выполняют десятичные знаки, они делают (в лучшем случае) двоичные файлы. Шестнадцатеричные карты в двоичном формате очень чисто, но для этого требуется немного работы для преобразования десятичного числа в двоичный.

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

// These error flags tend to indicate that error flags probably 
// all start with 0x05.. 
public static final int GL_STACK_UNDERFLOW = 0x0504; 
public static final int GL_OUT_OF_MEMORY = 0x0505; 

// These EXP flags tend to indicate that EXP flags probably 
// all start with 0x08.. 
public static final int GL_EXP = 0x0800; 
public static final int GL_EXP2 = 0x0801; 

// These FOG flags tend to indicate that FOG flags probably 
// all start with 0x0B.., or maybe 0x0B^. 
public static final int GL_FOG_DENSITY = 0x0B62; 
public static final int GL_FOG_START = 0x0B63; 
public static final int GL_FOG_END = 0x0B64; 
public static final int GL_FOG_MODE = 0x0B65; 

С десятичных чисел, один будет трудно «уведомление» константных областей битов по большому количеству различных, но связанных между собой элементов.

+0

Почему вы говорите: «Они [компьютеры] делают (в лучшем случае) двоичные»? Вы когда-нибудь работали с компьютером, который делал ничего, кроме двоичного? У меня создалось впечатление, что любые компьютеры, работающие с другими базами, например, trinary, были в основном просто гипотетическими с несколькими встроенными в качестве доказательств концепций? – ArtOfWarfare

+0

(в лучшем случае) должен был быть индикатором того, что все базовые операции на общих компьютерах являются двоичными по своей природе и не предназначены для разработки по более высоким степеням (трехмерные, восьмеричные, десятичные, шестнадцатеричные и т. Д.). Мне приходилось иметь дело с три логики состояния, но не полный компьютер, построенный на трех логиках состояния. Некоторые из завершающих схем для коммутаторов в системах управления имеют три состояния: «open/closed/failed», где failed указывает, что схема не может подтвердить, что она правильно открыта или закрыта. Естественно, мы просто переводим это на два бинарных бита и назначаем дополнительное состояние «ошибки». –

3

Hexadecimal - это самый читаемый формат в двоичном формате. Это упрощает операции с большим количеством бит, например

5

Когда дело доходит до больших чисел, представление их в шестнадцатеричном формате делает их более читабельными, поскольку они более компактны.

Кроме того, иногда это значение имеет значение для преобразований в двоичное: шестнадцатеричное число может быть очень легко преобразовано в двоичное. Некоторым программистам нравится это делать, это помогает при выполнении операций с битами по номерам.

Что касается увеличения производительности: нет, его нет.

3

0xB62 равна 2914 :-)

для разработчиков гораздо легче мысленно представить битовую структуру постоянная, когда он представлен в шестнадцатеричном, чем когда она представлена ​​в качестве основы 10 числа.

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

22

«Это, очевидно, проще определить 2914 вместо 0x0B62»

я не знаю об этом конкретном случае, но довольно часто это не так.

Из двух вопросов:

  • A) Что такое битовое значение 2914?
  • B) Какое значение бит 0x0B62?

B ответит более корректно быстрее у многих разработчиков. (Это касается подобных вопросов, а)


0x0B62 (это имеет длину 4 шестнадцатеричных цифр, так что reprensents 16-битное число)

  • биты 0 = 0000
  • биты из B = 1011
  • бит 6 = 0110
  • бит 2 = 0010

->

(Смею вас сделать то же самое с 2914.)


Это одна причина для использования шестнадцатеричного значения, другой является то, что источником стоимости может используйте hex (стандарт спецификации, например).

Иногда я просто нахожу это глупо, как:

public static final int NUMBER_OF_TIMES_TO_ASK_FOR_CONFIRMATION = ...; 

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

+0

Обоснование конверсии довольно слабое: Старт - Программы - Стандартные - Калькулятор - ввод десятичного числа - переход в двоичный режим - прибыль !На самом деле у меня есть калькулятор на панели задач, поэтому пропустите шаги 1-3. – Kromster

+5

Прошу прощения, что мой вопрос был недостаточно ясным. «Расчеты» выше выполняются почти мгновенно мной и другими - мы часто делаем, прежде чем вставляем значение в ваш калькулятор. Довольно часто мне кажется, что меня интересует только один бит (флаг), поэтому я не просматриваю всю строку, просто нахожу байт/цифру, покрывающую этот бит. – esej

+4

@esej: Чтобы сделать вещи еще более ясными, сравните сложность поиска битовой диаграммы 0x60000000 по сравнению с 1610612736. Если в обоих числах имеется много ненулевых цифр, отличных от F, разница в сложности не так ясна, но много практических шестнадцатеричных значений состоят в основном из нулей и F. – supercat

6

Вы предпочитаете писать 0xFFFFFFFF или 4294967295?

Первый из них более четко представляет собой 32-битный тип данных со всеми. Разумеется, многие опытные программисты узнают последний образец и имеют скрытое подозрение относительно его истинного смысла. Однако даже в этом случае он гораздо более подвержен ошибкам ввода и т. Д.

+0

0x отлично подходит для RGBA colorvalues, в других случаях старые старые константы * GL_SOMETHING * являются лучшими. – Kromster

1

Иногда проще использовать битовые алгоритмы. В других случаях речь идет о бит-сравнениях, так как мой комментарий в комментарии, 4 бита (двоичные цифры) преобразуются в 1 шестнадцатеричную букву, поэтому A3 = 10100011.

Другие времена, это либо забавно, либо ломает монотонность, хотя люди, не знакомые с шестигранной могут подумать, что вы делаете вещи с указателями

int data = 0xF00D; 
if (val != 0xC0FFEE) 
{ 
    data = 0xDECAF; 
} 

Я иногда использую его, чтобы проверить границы вещей, как Интс. Например, вы можете использовать 0x7FFFFFFF (0x80000000 работает во многих случаях, но 0x7F ... безопаснее), чтобы получить максимальную ширину int. Это удобно для установки очень высокой константы ошибок, если у вас нет языка, который имеет что-то вроде MAX_INT. Техника также масштабируется, так как для 64-битных вы можете использовать 0x7FFFFFFFFFFFFFFF. Вы можете заметить, что Android использует 0x7_ __ для поиска таблиц R.id.

Держу пари, что они делают это ради ясности. Вы можете легко использовать целые числа, но если вы знакомы с шестнадцатеричным, это неплохо. Похоже, что они резервируют значения х для определенных функций. В десятичной форме вы делаете что-то вроде 0-99, это ошибки, 100-199 для чего-то еще и т. Д. Как они это делают, масштабируется по-разному.

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

3

Ahh но 0xDECAFF является как простым (1460959), так и приятным фиолетовым цветом (в RGB).

Для колонок цвета МНОГО более удобно.

FF FF FF белый 00 00 FF синий FF 00 00 красный 00 FF 00 зеленый Легко видеть цветовые соотношения в виде чисел (хотя гамма и верность человеческого глаза, как правило, бросают вещи, но мы будем игнорировать эти неудобные физические факты для чистой математической точности!

Смежные вопросы