ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 апреля
957370 Топик полностью
Boвa (07.11.2019 11:36 - 11:43, просмотров: 290) ответил misyachniy на Каждый раз считывается состояния порта целиком - 8 дискретных входов.
Магия  
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));
};