Очень, очень короткий, с упором на двоичный
Человечество эволюционировало, я бы сказал, медленно, от системы счисления к системе счисления, и на данный момент большинство из нас приняли и используют десятичную систему в нашей повседневной жизни.
Есть много других систем счисления, которые мы все еще используем для конкретных задач, а некоторые давно забыты.
Мы рассмотрим некоторые из них.
Аддитивная система счисления
Мы начнем с римской системы счисления, которая зародилась в Древнем Риме и оставалась обычным способом записи чисел во всей Европе вплоть до позднего средневековья.
Это аддитивная система, содержащая 7 символов (I, V, X, L, C, D и M, соответствующие по значению 1, 5, 10, 50, 100, 500 и 1000). Буква N иногда использовалась для обозначения 0 как отдельного числа.
Правила следующие:
- символы размещаются по возрастанию справа налево, как это происходит с десятичными знаками.
- любой символ, имеющий меньшее значение, чем предыдущий, вычитается из значения предыдущего
Если вы посетите Европу, вы можете увидеть буквы, выгравированные в музеях, на зданиях и статуях вокруг вас. Некоторые из этих букв вы также можете найти на своих наручных часах.
Например, ниже показан год 1864 (MDCCCLXIV).
Следуя ранее упомянутым правилам, MDCCCLXIV = V - I + X + L + C + C + C + D + M, а его посимвольный эквивалент в десятичном формате равен 1864 = 5–1 + 10 + 50 + 100 + 100 +. 100 + 500 + 1000.
Как видно выше, он менее подробный и более легкий для чтения и записи 1864 по сравнению с MDCCCLXIV. Нам, людям, также проще выполнять базовые вычисления с десятичными знаками (складывать, вычитать, умножать, делить).
Любопытен тот факт, что текущий печально известный год, 2020, имеет ту же длину в десятичных числах, что и в нотации римских цифр: MMXX.
Так что неудивительно, что европейцы приняли десятичную систему счисления, отказавшись от римской.
Позиционная система счисления
Позиционная система счисления с основанием n (где n натуральное число больше 1, известное как основание системы счисления) содержит n основных символов (цифр), которые соответствуют к первым n натуральным числам, включая 0. Остальные числа получаются с учетом положения символа в числе. При движении справа налево значение каждого символа умножается на n, возведенное в степень его позиции.
В отличие от римской системы, которая является аддитивной, десятичная система является позиционной.
Также называется base-10, потому что в нем используются 10 цифр (от 0 до 9), это система счисления, которую мы используем в нашей повседневной жизни.
Следуя приведенному выше определению и используя в качестве примера год 1864, мы получаем:
Двоичная система
Человечество эволюционировало, я бы сказал, медленно, от системы счисления к системе счисления, и на данный момент большинство из нас приняло и использует десятичную систему.
С другой стороны, компьютеры используют в своей повседневной жизни двоичную систему счисления. Это также называется base-2, и в нем используются цифры 0 и 1.
Следуя приведенному выше определению и используя в качестве примера год 1864, который равен 11101001000 в двоичной системе, мы получаем:
Сравнивая 1864 с 11101001000, вы можете согласиться с тем, что первый из них более понятен и удобен для человека.
Бинарные операторы
В дальнейшем мы будем использовать язык программирования Dart для демонстрации операторов, но эта наука применима к любому языку программирования.
Операторы, используемые в двоичной области, сильно отличаются от тех, которые мы используем в десятичной системе: &
, |
, ^
, ~
, >>
и <<
.
И (&) используется для определения того, является ли конкретный бит 1 или 0 . Этот оператор принимает два двоичных представления одинаковой длины и выполняет логическую операцию И для каждой пары соответствующих битов. Если оба бита в сравниваемой позиции равны 1, бит в результирующем двоичном представлении равен 1, в противном случае результат равен 0.
assert(1 & 1 == 1); assert(1 & 0 == 0); assert(0 & 1 == 0); assert(0 & 0 == 0);
ИЛИ (|) принимает два двоичных представления определенной длины и выполняет логическую операцию включающего ИЛИ для каждой пары соответствующих битов. Результатом в каждой позиции является 0, если оба бита равны 0, в противном случае результат равен 1.
assert(1 | 1 == 1); assert(1 | 0 == 1); assert(0 | 1 == 1); assert(0 | 0 == 0);
XOR (^) используется для переключения определенных битов между 1 и 0. Этот оператор принимает два двоичных представления одинаковой длины и выполняет логическую операцию включающего ИЛИ для каждой пары соответствующих битов. Результатом в каждой позиции является 0, если оба бита равны 0, в противном случае результат равен 1.
assert(1 ^ 0 == 1); assert(0 ^ 1 == 1); assert(1 ^ 1 == 0); assert(0 ^ 0 == 0);
НЕ или дополнение (~) выполняет логическое отрицание для каждого бита. Биты, равные 0, становятся 1, а те, которые равны 1, становятся 0.
assert(~1 == 0); assert(~0 == 1); assert(~0001 == 1110);
Сдвиг влево (‹<) сдвигает биты влево, а нули сдвигаются как новая цифра.
assert(1 << 1 == 2);
Сдвиг вправо (››) сдвигает цифры вправо, а нули заменяют отброшенные биты.
assert(1 >> 1 == 0);
При желании вы можете прочитать больше здесь об операторах Dart.
Это было очень короткое и быстрое введение в двоичный код, но я надеюсь, что оно достаточно хорошо для понимания основ и этого примера битовой маскировки.
Это все!