Какова цель левого смещения нуля на любую сумму?
После чтения исходного кода ASM 4.1 я обнаружил следующие экземпляры:
int ASM4 = 4 << 16 | 0 << 8 | 0;
int ASM5 = 5 << 16 | 0 << 8 | 0;
Оставляет ли эти левые сдвиги нуля на 8 делать что-либо с выражением, или "или" на 0, если это важно?
Разве это не было бы эквивалентно просто:
int ASM4 = 4 << 16;
int ASM5 = 5 << 16;
Ответы
Ответ 1
Действительно, они эквивалентны, но одним из возможных объяснений является то, что они хотели сопоставить номера версий, включая как основные, так и младшие номера, с уникальным идентификатором в своем коде. Итак, в следующем:
int ASM4 = 4 << 16 | 0 << 8 | 0; // this looks like 4.0.0
int ASM5 = 5 << 16 | 0 << 8 | 0; // this looks list 5.0.0
4
и 5
представляют версии 4
и 5
соответственно, а zero
in 0 << 8
потенциально могут быть младшими номерами, а последний zero
- еще одно незначительное число, так как в 4.0.0
и 5.0.0
. Но это все равно. Вам действительно нужно спросить авторов.
Ответ 2
В контексте:
// ASM API versions
int ASM4 = 4 << 16 | 0 << 8 | 0;
int ASM5 = 5 << 16 | 0 << 8 | 0;
Да, это эквивалентно
int ASM4 = 4 << 16;
int ASM5 = 5 << 16;
Это просто написано так, чтобы было ясно, что мы устанавливаем 3-й байт в 4, а оба нижних байта равны 0. В качестве альтернативы, это номер версии, который следует читать как 4.0.0.
Ответ 3
Это действительно нецелесообразно, но затем оно аккуратно и визуально выровнено так, что разработчики ASM знают о версиях опкодов (если я не ошибаюсь, это интерфейс OpCodes
, который вы смотрите здесь).
То же самое, что вы использовали бы 1 << 0
vs 1 << 1
и т.д.