Подтвердить что ты не робот

Какова цель левого смещения нуля на любую сумму?

После чтения исходного кода 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;
4b9b3361

Ответ 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 и т.д.