Skip to content

Системы счисления

В программировании понимание различных систем счисления имеет фундаментальное значение. Dart, как современный язык программирования, предоставляет гибкие инструменты для работы с числами в разных форматах. В этой статье мы рассмотрим основные системы счисления и способы работы с ними в Dart.

Основные системы счисления в программировании

Системы счисления

Десятичная система (основание 10)

Десятичная система — наиболее привычная для нас система счисления, используемая в повседневной жизни. Она использует 10 цифр: от 0 до 9.

// Объявление десятичных чисел в Dart
int decimalNumber = 42;
double decimalFloat = 42.5;

Бинарная система (основание 2)

Бинарная, или двоичная система использует только две цифры: 0 и 1. Это фундаментальная система для компьютеров, так как процессоры работают с электрическими сигналами, которые могут находиться в одном из двух состояний.

// Объявление бинарного числа в Dart
int binaryNumber = 0b101010; // 42 в десятичной

Шестнадцатеричная система (основание 16)

Шестнадцатеричная система использует 16 символов: цифры от 0 до 9 и буквы от A до F. Она часто используется в программировании для компактного представления двоичных данных.

// Объявление шестнадцатеричного числа в Dart
int hexNumber = 0x2A; // 42 в десятичной

Восьмеричная система (основание 8)

Восьмеричная система использует 8 цифр: от 0 до 7. Хотя она менее распространена в современном программировании, исторически она использовалась во многих компьютерных системах.

// Объявление восьмеричного числа в Dart
int octalNumber = int.parse('52', radix: 8); // 42 в десятичной

Преобразование между системами счисления в Dart

Dart предоставляет удобные методы для преобразования чисел между различными системами счисления.

Из строки в число

// Преобразование строк в числа с указанием основания
int decimalFromString = int.parse('42'); // Десятичное
int binaryFromString = int.parse('101010', radix: 2); // Двоичное
int octalFromString = int.parse('52', radix: 8); // Восьмеричное
int hexFromString = int.parse('2A', radix: 16); // Шестнадцатеричное

Из числа в строку

// Преобразование чисел в строки с указанием основания
String decimalToString = 42.toString(); // '42'
String binaryToString = 42.toRadixString(2); // '101010'
String octalToString = 42.toRadixString(8); // '52'
String hexToString = 42.toRadixString(16); // '2a'

Битовые операции в Dart

Dart поддерживает стандартные битовые операции, которые особенно полезны при работе с двоичными числами.

int a = 0b1010; // 10 в десятичной
int b = 0b1100; // 12 в десятичной
 
// Битовое И (AND)
int bitwiseAnd = a & b; // 0b1000 (8 в десятичной)
 
// Битовое ИЛИ (OR)
int bitwiseOr = a | b; // 0b1110 (14 в десятичной)
 
// Битовое исключающее ИЛИ (XOR)
int bitwiseXor = a ^ b; // 0b0110 (6 в десятичной)
 
// Битовое отрицание (NOT)
int bitwiseNot = ~a; // Инвертирует все биты
 
// Битовый сдвиг влево
int leftShift = a << 1; // 0b10100 (20 в десятичной)
 
// Битовый сдвиг вправо
int rightShift = a >> 1; // 0b0101 (5 в десятичной)

Практическое применение разных систем счисления

Цвета в шестнадцатеричном формате

Шестнадцатеричная система часто используется для задания цветов в веб-разработке и графических приложениях.

// Определение цвета в шестнадцатеричном формате
int redColor = 0xFF0000; // Красный цвет
int greenColor = 0x00FF00; // Зеленый цвет
int blueColor = 0x0000FF; // Синий цвет
 
// Получение отдельных компонентов RGB из цвета
int hexColor = 0x1A2B3C;
int red = (hexColor >> 16) & 0xFF; // 26 (0x1A)
int green = (hexColor >> 8) & 0xFF; // 43 (0x2B)
int blue = hexColor & 0xFF; // 60 (0x3C)

Битовые флаги

Битовые флаги — эффективный способ хранения множества булевых значений в одном числе.

// Определение битовых флагов
const int BOLD = 1; // 0001
const int ITALIC = 2; // 0010
const int UNDERLINE = 4; // 0100
const int STRIKETHROUGH = 8; // 1000
 
// Установка флагов
int textStyle = 0;
textStyle |= BOLD; // Добавление жирного
textStyle |= ITALIC; // Добавление курсива
 
// Проверка флага
bool isBold = (textStyle & BOLD) != 0; // true
bool isUnderline = (textStyle & UNDERLINE) != 0; // false
 
// Удаление флага
textStyle &= ~ITALIC; // Удаление курсива

Другие системы счисления

Хотя бинарная, десятичная, восьмеричная и шестнадцатеричная системы наиболее распространены, Dart позволяет работать с любой системой от основания 2 до 36.

// Работа с нестандартными основаниями
int base30Number = int.parse('ABC', radix: 30);
String base30String = 1000.toRadixString(30);

Применение систем счисления при форматировании чисел

Системы счисления могут применяться при форматировании вывода:

void main() {
  int number = 42;
 
  print('Десятичная: $number');
  print('Бинарная: ${number.toRadixString(2).padLeft(8, '0')}');
  print('Восьмеричная: ${number.toRadixString(8)}');
  print('Шестнадцатеричная: 0x${number.toRadixString(16).toUpperCase()}');
 
  // Вывод:
  // Десятичная: 42
  // Бинарная: 00101010
  // Восьмеричная: 52
  // Шестнадцатеричная: 0x2A
}

Заключение

Понимание и правильное использование различных систем счисления — важный навык для любого разработчика. Dart предоставляет богатый набор инструментов для работы с числами в разных форматах, от простого преобразования до сложных битовых операций.

Выбор системы счисления зависит от контекста задачи:

  • Десятичная система более интуитивно понятна людям
  • Бинарная система отражает внутреннее представление в компьютере
  • Шестнадцатеричная система компактна и удобна для работы с большими двоичными числами
  • Восьмеричная система имеет историческое значение и все еще используется в некоторых случаях

Освоив работу с различными системами счисления в Dart, вы сможете эффективно решать широкий круг задач: от работы с цветами и битовыми флагами до низкоуровневого программирования и криптографии.

Конечно, вот оформленные задачи:


Домашнее задание

Конечно, вот 5 простых задач для закрепления материала по системам счисления в Dart:


Домашнее задание

Задачи на закрепление основ работы с системами счисления в Dart.

1. Преобразование из двоичной в десятичную систему

Задача: Написать функцию, которая принимает двоичное число в виде строки и возвращает его десятичный эквивалент.

binaryToDecimal("1010") -> 10
binaryToDecimal("1111") -> 15

2. Преобразование из десятичной в шестнадцатеричную систему

Задача: Написать функцию, которая принимает десятичное число и возвращает его шестнадцатеричный эквивалент в виде строки.

decimalToHex(10) -> "A"
decimalToHex(26) -> "1A"

3. Сумма двоичных чисел

Задача: Написать функцию, которая принимает две двоичные строки и возвращает их сумму в виде двоичной строки.

binarySum("10", "11") -> "101"
binarySum("111", "1") -> "1000"

4. Битовый сдвиг влево

Задача: Написать функцию, которая принимает десятичное число и число сдвига, и возвращает результат битового сдвига влево.

leftShift(5, 2) -> 20
leftShift(3, 3) -> 24

5. Проверка чётности числа с помощью битовых операций

Задача: Написать функцию, которая принимает десятичное число и возвращает true, если число чётное, и false, если нечётное, используя битовые операции.

isEven(4) -> true
isEven(7) -> false

6. Перевод числа из любой системы счисления в десятичную

Задача: Написать метод, который принимает число в виде строки и основание системы счисления (от 2 до 16) и возвращает это число в десятичной системе счисления.

convertToDecimal([число], [основание_системы_счисления]) -> [число_в_десятичной_системе]

Примеры:

convertToDecimal("1010", 2) -> 10
convertToDecimal("1A", 16) -> 26

Дополнительные материалы

Конечно, вот оформленные в Markdown ссылки:

  1. Numbers in Dart
  2. Троичный компьютер
  3. Шестнадцатеричная система
  4. Двадцатиричная система
  5. Шестидесятеричная система
  6. Двенадцатеричная система счисления
  7. Цифры майя