ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 ноября
455694
инженегр (20.10.2013 19:53, просмотров: 5018)
Проверка на чётность (флаг PF(x86) чётное число единичных битов) какие способы быстрого вычисления чётности существуют в различных архитектурах? Есть задача, суть чуть ниже, для ускорения вычислений нужен флаг четности, хотел проверить алгоритм на x86, начал освежать ассемблер и тут ждало разочарование (PF - Флаг чётности (бит 2). Устанавливается, если младший байт результата содержит чётное число единичных битов, в противном случае сбрасывается (из истории этого бита, использовался для формирования бита чётности COM порта, поэтому только байт)) а мне нужно минимум 32 бита! Сама задача на вики ru.wikipedia.org/wiki/%D0%E5%E3%E8%F1%F2%F0_%F1%E4%E2%E8%E3%E0_%F1_%EB%E8%ED%E5%E9%ED%EE%E9_%EE%E1%F0%E0%F2%ED%EE%E9_%F1%E2%FF%E7%FC%FE это выражение считать на Си не очень эффективно S = ((( (S>>31)^(S>>30)^(S>>29)^(S>>27)^(S>>25)^S ) & 1 ) << 31 ) | (S>>1); На ассемблере без флага чётности выходит тоже. Хотелось примерно вот что (можно ещё оптимизировать): eax = lfsr, ebx = полином, AT&T-синтаксис: movl %%eax,%%ecx; // ecx = eax rorl %%eax; // eax >>= 1 andl %%ecx,%%ebx; // ebx &= ecx jpe parity; // если результат четный orl $0x80000000,%%eax; // иначе установим ст. разряд parity: Каждый прогон вычисляет один бит результата.