Некоторые процессоры (в частности, x86 CPU) имеют флаг четности в своем регистре состояния. Этот флаг указывает, является ли количество битов результата операции нечетным или четным.
Какую практическую цель выполняет флаг четности в контексте программирования?
Примечание: Я предполагаю, что он должен использоваться вместе с битом четности для выполнения базовой проверки ошибок, но такая задача кажется слишком редкой, чтобы для нее требовался целый флаг процессора.
В "старые времена", когда производительность всегда была проблемой, это имело больше смысла. Он использовался в коммуникациях для проверки целостности (проверки ошибок), и значительная часть коммуникаций была последовательной, которая больше использует четность, чем параллельные коммуникации. В любом случае, для CPU было тривиально вычислить его, используя всего 8 XOR-гейтов, но в остальном его было довольно трудно вычислить без поддержки CPU. Без аппаратной поддержки для этого требовался настоящий цикл (возможно, развёрнутый) или таблица поиска, что отнимало много времени, поэтому преимущества перевешивали затраты. Однако сейчас это скорее пережиток.
Флаг четности - это пережиток старых времен, когда проверка четности выполнялась программно.
TL;DR
Как выразился Рэндалл Хайд в The Art of Assembly Language, 2nd Edition:
Четность - это очень простая схема обнаружения ошибок, изначально использовавшаяся в телеграфах и других протоколах последовательной связи. Идея заключалась в подсчете количества установочных битов в символе и включении дополнительного бита в передачу, чтобы указать, содержит ли этот символ четное или нечетное количество установочных битов. Принимающий конец передачи также подсчитывал биты и проверял, что дополнительный бит "четности" указывает на успешную передачу.
В старые времена существовало оборудование для последовательной передачи данных (UART), которое не имело возможности выполнять проверку четности передаваемых данных, поэтому программистам приходилось делать это программно. Также некоторые действительно старые устройства, такие как перфораторы и считыватели бумажных лент, использовали 7 бит данных и бит четности, и программистам приходилось делать проверку четности в программном обеспечении для проверки целостности данных. Чтобы иметь возможность использовать бит четности для обнаружения ошибок, общающиеся стороны должны были заранее договориться о том, должен ли каждый передаваемый байт иметь четную или нечетную четность (часть протокола связи).
Основными методами проверки четности в программном обеспечении без поддержки процессора являются счет бит или использование таблицы просмотра. Оба способа очень дороги по сравнению с тем, что флаг четности в центральном процессоре вычисляется одной инструкцией. По этой причине в апреле 1972 года Intel ввела флаг четности в свой 8008 8-битный CPU. Вот пример того, как с тех пор каждый байт может быть проверен на целостность на приемной стороне.
mov al,<byte to be tested>
test al,al
jp <somewhere> ; byte has even parity
; byte has odd parity
Затем программа могла выполнять всевозможные условные логические операции, основанные на значении флага четности.
JPO
, JPE
), вызовов (CPO
, CPE
) и возвратов (RPO
, RPE
).JNP/JPO
, JP/JPE
).SETPE/SETP
и SETPO/SETNP
.CMOVP/CMOVPE
, CMOVNP/CMOVPO
добавлены в Pentium Pro.С тех пор этот набор инструкций, использующих флаг четности, остается неизменным.
В настоящее время основное назначение этого флага перешло к аппаратным средствам. Цитируя Рэндалла Хайда в The Art of Assembly Language, 2nd Edition:
Микросхемы последовательной связи и другое коммуникационное оборудование, использующее четность для проверки ошибок, обычно вычисляют четность аппаратно; вам не нужно использовать для этого программное обеспечение.
Древность флага четности подтверждается тем, что он работает только с младшими 8 битами, поэтому имеет ограниченное применение. Согласно руководствам разработчика программного обеспечения для архитектур Intel® 64 и IA-32 флаг четности является:
Устанавливается, если последний по значению байт результата содержит четное количество битов 1; очищается в противном случае.
Интересный факт: По его собственным словам, сетевой инженер Вольфганг Керн просканировал весь написанный им в свое время код (~14 ГБ) на предмет наличия инструкций JPE
и JPO
и нашел их только в модуле драйвера RS232 и в очень старом 8-битном вычислении.
вычислении.
Существует одна практическая микро-оптимизация, достижимая с помощью четности - это замена битов, используемая, например, при генерации адресов с помощью преобразования Фурье с использованием ядра бабочки.
Чтобы поменять местами биты 7 и 0, можно использовать четность (a&0x81), за которой следует условная (a^=0x81). Повторите для битов 6/1, 5/2 и 4/3.