Руководство по Двоичной Системе и Преобразованию Систем Счисления: Визуальное Понимание от Побитовых Операций до Кодирования Данных
Инструменты разработки
Основы Систем Счисления
Четыре Распространённые Системы Счисления
| Система | Основание | Цифры | Префикс | Пример |
|---|---|---|---|---|
| Двоичная | 2 | 0,1 | 0b |
0b1010 = 10 |
| Восьмеричная | 8 | 0-7 | 0o |
0o12 = 10 |
| Десятичная | 10 | 0-9 | Нет | 10 |
| Шестнадцатеричная | 16 | 0-9,A-F | 0x |
0xA = 10 |
Методы Преобразования
Любая Система → Десятичная
Двоичная 1010 → 1×2³ + 0×2² + 1×2¹ + 0×2⁰ = 8 + 0 + 2 + 0 = 10
Шестнадцатеричная FF → 15×16¹ + 15×16⁰ = 240 + 15 = 255
Десятичная → Любая Система
10 → Двоичная:
10 ÷ 2 = 5 остаток 0
5 ÷ 2 = 2 остаток 1
2 ÷ 2 = 1 остаток 0
1 ÷ 2 = 0 остаток 1
Читаем снизу вверх: 1010
255 → Шестнадцатеричная:
255 ÷ 16 = 15 остаток 15
15 ÷ 16 = 0 остаток 15
Читаем снизу вверх: FF
Преобразование Систем Счисления в JavaScript
// parseInt в десятичную
parseInt('1010', 2) // 10
parseInt('FF', 16) // 255
parseInt('12', 8) // 10
// toString в целевую систему
(10).toString(2) // "1010"
(255).toString(16) // "ff"
(255).toString(8) // "377"
// Литералы
0b1010 // 10
0o12 // 10
0xFF // 255
Побитовые Операции на Практике
Шесть Побитовых Операций
| Операция | Символ | Пример | Результат |
|---|---|---|---|
| AND | & |
0b1100 & 0b1010 |
0b1000 (8) |
| OR | ` | ` | `0b1100 |
| XOR | ^ |
0b1100 ^ 0b1010 |
0b0110 (6) |
| NOT | ~ |
~0b1100 |
-0b1101 (-13) |
| Сдвиг влево | << |
0b0011 << 2 |
0b1100 (12) |
| Сдвиг вправо | >> |
0b1100 >> 2 |
0b0011 (3) |
Применение 1: Система Прав
const PERMISSIONS = {
READ: 1 << 0, // 0b0001 = 1
WRITE: 1 << 1, // 0b0010 = 2
DELETE: 1 << 2, // 0b0100 = 4
ADMIN: 1 << 3, // 0b1000 = 8
};
// Комбинирование прав
const editor = PERMISSIONS.READ | PERMISSIONS.WRITE; // 0b0011 = 3
const admin = PERMISSIONS.READ | PERMISSIONS.WRITE | PERMISSIONS.DELETE | PERMISSIONS.ADMIN; // 0b1111 = 15
// Проверка прав
function hasPermission(userPermissions: number, permission: number): boolean {
return (userPermissions & permission) === permission;
}
hasPermission(editor, PERMISSIONS.READ); // true
hasPermission(editor, PERMISSIONS.DELETE); // false
hasPermission(admin, PERMISSIONS.ADMIN); // true
// Добавление права
function addPermission(userPermissions: number, permission: number): number {
return userPermissions | permission;
}
// Удаление права
function removePermission(userPermissions: number, permission: number): number {
return userPermissions & ~permission;
}
Применение 2: Флаги
const FLAGS = {
BOLD: 1 << 0, // 1
ITALIC: 1 << 1, // 2
UNDERLINE: 1 << 2, // 4
STRIKETHROUGH: 1 << 3, // 8
};
// Установить: жирный + курсив
let style = FLAGS.BOLD | FLAGS.ITALIC; // 3
// Переключить подчёркивание
style ^= FLAGS.UNDERLINE; // 7 (добавить подчёркивание)
style ^= FLAGS.UNDERLINE; // 3 (убрать подчёркивание)
Применение 3: Цвет RGB
// RGB → число
function rgbToNumber(r: number, g: number, b: number): number {
return (r << 16) | (g << 8) | b;
}
// Число → RGB
function numberToRgb(n: number): { r: number; g: number; b: number } {
return {
r: (n >> 16) & 0xFF,
g: (n >> 8) & 0xFF,
b: n & 0xFF,
};
}
rgbToNumber(255, 128, 0); // 0xFF8000 = 16744448
numberToRgb(0xFF8000); // { r: 255, g: 128, b: 0 }
Применение 4: Быстрые Вычисления
// Умножение на степени 2
n * 2 === n << 1
n * 4 === n << 2
n * 8 === n << 3
// Деление на степени 2 (с усечением)
n / 2 === n >> 1 // положительные числа
Math.floor(n / 2) === n >> 1
// Проверка чётности
n & 1 // 0 = чётное, 1 = нечётное
// Остаток от деления на степени 2
n % 4 === n & 3
n % 8 === n & 7
n % 16 === n & 15
// Обмен двух значений (без временной переменной)
a ^= b; b ^= a; a ^= b;
Числа с Плавающей Точкой IEEE 754
Структура Двойной Точности (64 бита)
Бит знака(1) Биты порядка(11) Биты мантиссы(52)
S EEEEEEEEEEE MMMMMMMMMMMM...MMMM
Пример: -12.375
Знак: 1 (отрицательное)
Порядок: 10000000010 (1026, со смещением 3)
Мантисса: 1001001100000000...0
Проблемы Точности
// Классическая проблема
0.1 + 0.2 === 0.3 // false!
0.1 + 0.2 // 0.30000000000000004
// Причина: 0.1 и 0.2 в двоичной системе — бесконечные периодические дроби
// 0.1 = 0.0001100110011... (периодическая)
// 0.2 = 0.0011001100110... (периодическая)
// Решения
// 1. Использовать целочисленную арифметику
(0.1 * 10 + 0.2 * 10) / 10 // 0.3
// 2. Использовать toFixed
(0.1 + 0.2).toFixed(1) // "0.3"
// 3. Использовать сравнение с EPSILON
Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON // true
Специальные Значения
Number.MAX_SAFE_INTEGER // 9007199254740991 (2^53 - 1)
Number.MIN_SAFE_INTEGER // -9007199254740991
Number.MAX_VALUE // 1.7976931348623157e+308
Number.EPSILON // 2.220446049250313e-16
Infinity // Положительная бесконечность
-Infinity // Отрицательная бесконечность
NaN // Не число
Кодирование Base64 и Двоичные Данные
Принцип Кодирования
3 байта (24 бита) → 4 символа Base64 (по 6 бит каждый)
Пример: "Man"
M = 77 = 01001101
a = 97 = 01100001
n = 110 = 01101110
Объединено: 010011010110000101101110
Сгруппировано: 010011 010110 000101 101110
Индексы: 19 22 5 46
Символы: T W F u
Результат: "TWFu"
Использование Инструмента для Кодирования/Декодирования
- Откройте инструмент кодирования/декодирования Base64
- Введите текст или строку Base64
- Нажмите «Кодировать» или «Декодировать»
- Поддерживается преобразование файлов и изображений в Base64
Кодирование Hex
Таблица Соответствия Двоичный → Hex
0000 = 0 0100 = 4 1000 = 8 1100 = C
0001 = 1 0101 = 5 1001 = 9 1101 = D
0010 = 2 0110 = 6 1010 = A 1110 = E
0011 = 3 0111 = 7 1011 = B 1111 = F
Частые Применения
| Применение | Пример |
|---|---|
| Значения цвета | #FF8000 |
| MAC-адрес | 00:1A:2B:3C:4D:5E |
| Хеш-значения | a1b2c3d4e5f6... |
| Адреса памяти | 0x7fff5fbff8c0 |
| Двоичный просмотр | xxd file.bin |
Использование ToolsKu для Преобразования Систем Счисления
- Откройте инструмент преобразования систем счисления
- Введите значение
- Выберите входную систему счисления
- Просмотрите результаты преобразования во всех системах
Часто Задаваемые Вопросы
Почему побитовые операции в JavaScript поддерживают только 32 бита?
Побитовые операции в JavaScript преобразуют числа в 32-битные целые со знаком, биты сверх 32 бит усекаются:
0xFFFFFFFF // 4294967295 (обычное число)
0xFFFFFFFF | 0 // -1 (переполнение при преобразовании в int32)
// Побитовые операции с большими числами требуют BigInt
(0xFFFFFFFFFn & 0xFFn).toString(16) // "ff"
Как просмотреть двоичное содержимое файла?
# hex dump
xxd file.bin
# Или используйте Hex-просмотрщик ToolsKu
# Загрузите файл → просмотрите шестнадцатеричное/двоичное содержимое
Итоги
Двоичная система — основа вычислений — системы прав, кодирование цветов, точность чисел с плавающей точкой и кодирование Base64 зависят от неё. Освоение преобразования систем счисления и побитовых операций позволяет писать более эффективный низкоуровневый код. ToolsKu предоставляет инструменты Преобразование систем счисления, Кодирование/Декодирование Base64 и другие, помогая быстро решать задачи преобразования и кодирования.
#二进制#进制转换#位运算#数据可视化#教程