Системы счисления
В программировании понимание различных систем счисления имеет фундаментальное значение. 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 ссылки: