Понимание того, почему выполняются определенные операции с битами - PullRequest
1 голос
/ 15 мая 2019

Ниже приведен исходный код реализации Keytab в Java. Этот фрагмент читает версию ключа из файла keytab. У меня проблемы с пониманием, как это работает. Почему выполняется операция побитового И и сдвига влево?

Что мой код называет:

KeyTab keytab = KeyTab.getInstance(keytabFile); // passing keytab file location. 

Этот файл в двоичном формате. KeyTabInputStream читает данные.

  private void load(KeyTabInputStream var1) throws IOException, RealmException {
        this.entries.clear();
        **this.kt_vno = var1.readVersion();**
        if (this.kt_vno == 1281) {
            var1.setNativeByteOrder();
        }

        boolean var2 = false;

        while(var1.available() > 0) {
            int var4 = var1.readEntryLength();
            KeyTabEntry var3 = var1.readEntry(var4, this.kt_vno);
            if (DEBUG) {
                System.out.println(">>> KeyTab: load() entry length: " + var4 + "; type: " + (var3 != null ? var3.keyType : 0));
            }

            if (var3 != null) {
                this.entries.addElement(var3);
            }
        }

    }
    public int readVersion() throws IOException {
        int var1 = (this.read() & 255) << 8;
        return var1 | this.read() & 255;
    }

1 Ответ

1 голос
/ 15 мая 2019

this.read() предположительно возвращает 8 "интересных" битов, поскольку & 255 "извлекает" только последние 8 битов, сдвиг на 8 бит означает, что теперь биты 9-16 содержат данные.
Затем, выполнив еще одно чтение + &, снова получим 8 битов, |, что со смещенными битами из предыдущего шага теперь у вас есть один int с 16 установленными соответствующими битами: бит 1-8 удерживает результат второго чтения, пока биты 9-16 содержат биты первого чтения.

...