Руководство по Двоичной Системе и Преобразованию Систем Счисления: Визуальное Понимание от Побитовых Операций до Кодирования Данных

Инструменты разработки

Основы Систем Счисления

Четыре Распространённые Системы Счисления

Система Основание Цифры Префикс Пример
Двоичная 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"

Использование Инструмента для Кодирования/Декодирования

  1. Откройте инструмент кодирования/декодирования Base64
  2. Введите текст или строку Base64
  3. Нажмите «Кодировать» или «Декодировать»
  4. Поддерживается преобразование файлов и изображений в 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 для Преобразования Систем Счисления

  1. Откройте инструмент преобразования систем счисления
  2. Введите значение
  3. Выберите входную систему счисления
  4. Просмотрите результаты преобразования во всех системах

Часто Задаваемые Вопросы

Почему побитовые операции в 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 и другие, помогая быстро решать задачи преобразования и кодирования.

#二进制#进制转换#位运算#数据可视化#教程