Очень, очень короткий, с упором на двоичный

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

Есть много других систем счисления, которые мы все еще используем для конкретных задач, а некоторые давно забыты.

Мы рассмотрим некоторые из них.

Аддитивная система счисления

Мы начнем с римской системы счисления, которая зародилась в Древнем Риме и оставалась обычным способом записи чисел во всей Европе вплоть до позднего средневековья.

Это аддитивная система, содержащая 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.

Это было очень короткое и быстрое введение в двоичный код, но я надеюсь, что оно достаточно хорошо для понимания основ и этого примера битовой маскировки.



Это все!