Лисья Нора

Оглавление


§ Что такое четность

Да, сейчас пойдет речь об одном почти бесполезном флаге четности PF, который был полезным только где-то в районе 1980-х годов, но спустя лет так 45 совершенно перестал быть нужным. Но не дадим забыть этот флаг! Пусть будет в наших сердцах и памяти. Возможно, оперативной.
Все знают что бывают чётные и нечетные числа. Это числа, которые кратны 2. Например, число 4 – четное, а вот 1'523'467'345 (один миллиард пятьсот двадцать три миллиона четыреста шестьдесят семь тысяч триста сорок пять) – уже нечетное. Как вообще определяется четность? Очень просто. Если это десятичная система счисления, то число всегда четно, если оно заканчивается на 0,2,4,6 или 8, и нечетно во всех остальных случаях. А двоичная? Там еще проще! В двоичной системе счисления если число заканчивается на 0, то оно четное, а если на 1, то нечетное, соответственно.

§ Четное количество

Как говорится, опять двадцать пять. Нечётное.
Поскольку мы легко и быстро научились определять четное или нечетное само по себе число, флаг же PF становится равным 1 тогда и только тогда когда сумма единичных младших 8 бит результата четная после выполнения арифметико-логической операции. Это значит что нам сначала надо подсчитать эти все биты и проверить результат:
a[0] + a[1] + a[2] + ... + a[7] = c
И вот если c будет четное, то тогда будем ставить PF=1. А четное всегда тогда, когда получилось 0 в младшем бите результата. То есть, надо инвертировать этот младший бит для того чтобы знать о том, четное ли количество единиц или нет.
Вопрос такой. Если мы считаем только младший бит, а все старшие выкидываем, а имеет ли вообще смысла суммировать старшие биты? Ответ простой – нет. Зачем? Все равно же выбрасываем их. Так что достаточно просто высчитать сумму младших битов. Теперь хочу сказать одну важную вещь. Чтобы сделать такой подсчет, мы спокойно воспользуемся логический функцией XOR:
A B C
0 0 0
0 1 1
1 0 1
1 1 0 -- младший бит!
Функция XOR, так сказать, это один из важнейших компонентов сумматора, потому что, если приглядеться внимательно, ее логическая функция суммирует биты друг с другом. Пример: 0+1=1, 1+1=0. Как видим, получился 0, но это потому что был перенос в старший разряд (который отбрасывается), так как 1+1=10.
Отсюда вывод, что сумму можно просто заменить на последовательность из XOR!
PF = a[0] ^ a[1] ^ a[2] ^ ... ^ a[7] ^ 1
Да, кстати, последний ^ 1 означает простую инверсию бита. Между прочим, в верилоге есть укороченная запись такого выражения, что было показано ранее:
wire pf = ~^a[7:0];
Вот и всё, что можно было сказать про вычисление бита четности. Кстати, да, я забыл сказать – он был нужен в 1980-х потому, что считать биты было очень накладно из-за невысоких скоростей процессора, да и памяти было мало, так что тот бит очень сильно спасал при вычислениях контрольного кода при приеме с UART. В нашу эпоху высоких скоростей процессорного ядра (5 Ггц на 2026 год) и неповоротливых Office-пакетах и еле запускающемся калькуляторе, это больше не требуется. Главное только винду не забыть переустанавливать вовремя, а то тормозит.