Двоичная система счисления

В позиции k двоичного числа стоит коэффициент при 2^k.

100001₂ = 1·2⁵ + 0·2⁴ + 0·2³ + 0·2² + 0·2¹ + 1·2⁰ = 33₁₀

Перевод положительного числа

Последовательно делим на 2 и читаем остатки снизу вверх:

33 / 2 = 16, остаток 1
16 / 2 =  8, остаток 0
 8 / 2 =  4, остаток 0
 4 / 2 =  2, остаток 0
 2 / 2 =  1, остаток 0
 1 / 2 =  0, остаток 1
→ 100001₂

В Java:

String bits = Integer.toBinaryString(33); // "100001"
int value = Integer.parseInt("100001", 2); // 33

Отрицательные числа

Целые знаковые типы Java используют дополнительный код. Для int число -1 — 32 единичных бита. Инверсия всех битов x дает ~x == -x - 1.

Integer.toBinaryString(-1); // 32 символа '1'

byte и short в выражениях продвигаются до int, поэтому для просмотра младших 8 бит:

String.format("%8s", Integer.toBinaryString(value & 0xff))
        .replace(' ', '0');

См. Побитовые операции.

На собеседовании

  • Почему 100001₂ равно 33? 2⁵ + 2⁰.
  • Как Java хранит отрицательные целые? В дополнительном коде.
  • Что делает маска & 0xff для byte? Оставляет младшие 8 бит без знакового расширения.
  • Сколько бит в int? 32.