Я не изучал ИТ, и только совсем недавно наткнулся на bit shifts и приложение для two's complement. Итак, можете ли вы использовать простой английский в своих объяснениях и предположить, что я почти ничего не знаю о IP-адресах, битовых операциях и типах данных Java?Как работает оператор сдвига в Java под капотом?
Сегодня я нашел следующий фрагмент кода (сокращенный):
long m = (-1) << (byte) 16;
Теперь это для маскировки IP-подсети. Я знаю, что мне нужно начать с 4 блоков из 8 бит (т. Е. 4 байта), и все биты должны быть «включены»: 11111111 11111111 1111111 1111111
Затем нули сдвигаются справа, в этом случае стоит 16 бит; поэтому получаем 11111111 11111111 00000000 0000000
, маску.
Но у меня есть несколько вопросов:
- Имеет ли
16
должен быть типаbyte
для этой работы? - результат:
long
. Когда выполняется вышеописанное выражение,-1
преобразуется в - эффективно - 4x8 бит. Как Java знает, что для применения двух дополнений требуется 32 позиции/бит (длина IP-адреса), а не, скажем, 16 или 8? (Я предполагаю, что это связано с типом данныхlong
?) - Почему для дополнения
-1
используется два дополнения? (Google дает вам-0b1
, если вы спросите его, что-1
находится в двоичном формате. Сначала я подумал, что это может быть связано с переполнением, но это не так, не так ли?) - Действительно, какие типы данных преобразуют компилятор это пока он работает с кодом, чтобы все это работало?
ОБНОВЛЕНИЕ:16
производится во время выполнения методом; Я просто поставил здесь константу в качестве примера. Оглядываясь назад, вероятно, плохая идея ...
32-битное значение будет вписываться в регистр, а операция по перераспределению бит обычно будет выполняться самим процессором, то, что в сборке будет выглядеть как 'shl AX, 16'. На этом уровне действительно нет типов данных. Вы получили только 8, 16, 32 или 64 бит. – GolezTrol
32 бита почти наверняка имеют больше общего с тем, что int is 32bits wide, чем длина IP-адреса (также, насколько я помню, когда битверение в Java, все автоматически распространяется на int) – Luke
Ни один из ваших четырех вопросы имеют какое-либо отношение к тому, как смены работают под капотом, поэтому вы, вероятно, должны использовать более описательный заголовок. – harold