Магия
typedef unsigned char Val;//можно и 32 бита - не существенно
class Mag
{
public:
Val S,F, SF; //Позапрошлое S и прошлое F значения переменной X, и их логическое и
Mag(){S=0;F=0;SF=0;};//Для начала запишем нулевые значения S F и их логического И
Val Mag3(Val X); //Функция мажорирования
};
Val Mag::Mag3(Val X)
//По условию каждый бит Mag3[i] равен 1 если соответствующие биты равны 1 хотя бы в двух из трех
// переменных (X,S,F)
//Т.е. Mag3[i]= (X[i] and F[i]) or (X[i] and S[i]) or (F[i] and S[i])
//переносы между битами с разными индексами не используются, следовательно операции между i-тым и k-тым
//битами могут происходить параллельно и:
//Mag3 = (X and F) or (X and S) or (F and S) сразу для всех разрядов
//Отсюда получаем код
{ Val T = X&F; //оптимизация
Val Z = T|SF|(S&X); //
SF = T;
S=F;
F=X;
return Z;
}
//Проверяем
void main()
{
Mag XX;
printf("------------------------\n");
printf("Val 2 %i\n",XX.Mag3(2));
printf("Val 3 %i\n",XX.Mag3(3));
printf("Val 2 %i\n",XX.Mag3(2));
printf("Val 0 %i\n",XX.Mag3(0));
printf("Val 7 %i\n",XX.Mag3(7));
printf("Val 0 %i\n",XX.Mag3(0));
printf("Val 8 %i\n",XX.Mag3(8));
};