Двоичная система счисления
В позиции 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.