Выбор значений для констант - PullRequest
2 голосов
/ 21 августа 2010

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

public static final int DM_FILL_BACKGROUND = 0x2;
public static final int DM_FILL_PREVIOUS = 0x3;
public static final int TRANSPARENCY_MASK = 1 << 1;
public static final int TRANSPARENCY_PIXEL = 1 << 2;

Что происходит с вещами 0x и <<?Почему люди не используют обычные целочисленные значения? </p>

Ответы [ 2 ]

6 голосов
/ 21 августа 2010

Сдвиг битов 1 обычно предназначен для ситуаций, когда у вас есть неисключительные значения, которые вы хотите сохранить.

Например, скажем, вы хотите иметь возможность рисовать линии на любой сторонекоробка.Вы определяете:

LEFT_SIDE   = 1 << 0  # binary 0001 (1)
RIGHT_SIDE  = 1 << 1  # binary 0010 (2)
TOP_SIDE    = 1 << 2  # binary 0100 (4)
BOTTOM_SIDE = 1 << 3  # binary 1000 (8)
                               ----
                               0111 (7) = LEFT_SIDE | RIGHT_SIDE | TOP_SIDE

Затем вы можете объединить их для нескольких сторон:

DrawBox (LEFT_SIDE | RIGHT_SIDE | TOP_SIDE) # Don't draw line on bottom.

Тот факт, что они используют совершенно разные биты, означает, что они независимы друг от друга.Используя OR их, вы получаете 1 | 2 | 4, что равно 7, и вы можете обнаружить каждый отдельный бит с помощью других логических операций (см. здесь и здесь для объясненияэти).

Если бы они были определены как 1, 2, 3 и 4, то вам, вероятно, придется либо сделать один вызов для каждой стороны, либо вам нужно будет передать четыре разных параметра, по одному на каждую сторону.В противном случае вы не могли бы определить разницу между LEFT and RIGHT (1 + 2 = 3) и TOP (3), поскольку оба они будут иметь одинаковое значение (с помощью простой операции сложения).

Материал 0x - это просто шестнадцатеричные числа, которые легче увидеть как двоичные битовые маски (каждая шестнадцатеричная цифра точно соответствует четырем двоичным цифрам. Вы будете склонны видеть шаблоны, такие как 0x01, 0x02, 0x04, 0x08, 0x10, 0x20 и т. Д., Поскольку они эквивалентны одиночному биту 1, перемещающемуся в старшую значащую битовую позицию - эти значения эквивалентны двоичным 00000001, 00000010, 00000100, 00001000, 00010000, 00100000 и т. Д.

В сторону: Как только вы привыкнете к гексагону, вам редко придется беспокоиться о 1 << n вещи. Вы можете мгновенно распознать 0x4000 как двоичный файл 0100 0000 0000 0000. Это менее очевидно, если вы увидите значение 16384 в коде, хотя некоторые из нас даже признают , что : -)

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

Относительно << материала: это в моем предпочтении.

Когда мне нужно определить константу с 1 в позиции бита 2 и 0 во всех остальных битах, я могу определить ее как 4, 0x4 или 1<<2. 1<<2, на мой взгляд, более читабельно и объясняет цель этой константы.

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

...