Advertisement
semenrbt

dz2

Mar 12th, 2021
609
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.71 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. struct Interval{
  5.     unsigned long vec;// 0 - инверсия 1 - без инверсии
  6.     unsigned long dnc; //  '-'. ЧЕрточка - 1
  7. };
  8.  
  9. int IsOneOrthogonal(struct Interval u, struct Interval v) {
  10.     unsigned long tmpUV, tmpU, tmpV,x;
  11.     tmpUV = v.dnc | u.dnc;
  12.     tmpU = u.vec | tmpUV;
  13.     tmpV = v.vec | tmpUV;
  14.     x= tmpU ^ tmpV;
  15.     x = x * 0x08040201; // Создаются 4 копии
  16.     x = x >> 3; // Удаление соответствующих битов
  17.     x = x & 0x11111111; // Каждый 4-й бит
  18.     x = x * 0x11111111; // Сумма цифр (0 или 1)
  19.     x = x >> 28; // Положение результата
  20.     if(x==1) return 1;
  21.     return 0;
  22. }
  23.  
  24.  
  25. // Функция IsDualOrthogonal проверяет два интервала на двуинверсную ортогональность и возвращает 1 - если двуинверсноортогональны, иначе - 0
  26. // Расммотрим пример
  27. // два интервала u и v
  28. // u = 0-1-110-         v = 1-1-0100
  29. // dnc=01010001         dnc=01010000
  30. // vec=00101100         vec=10100100
  31. // v.dnc = 01010000 * выполняем лог.сложенте
  32. // u.dnc = 01010001
  33. // tmpUV = 01010001
  34. //  Вектор tmpUV - маска компонент, на которые нам не нужно обращать
  35. // Накладываем маску на векторы
  36. // v.vec = 10100100 * выполняем лог.сложенте
  37. // tmpUV = 01010001
  38. // tmpV  = 11110101
  39. //
  40. // u.vec = 00101100 * выполняем лог.сложенте
  41. // tmpUV = 01010001
  42. // tmpU  = 01111101
  43. //
  44. // Делаем сумму по модулю между tmpU u tmpV
  45. //
  46. // tmpU  = 01111101
  47. // tmpV  = 11110101
  48. //    x =  10001000
  49. //
  50. // tmpU & x = 01111101 & 10001000 = 00001000
  51. // tmpV & x = 11110101 & 10001000 = 10000000
  52. // Они не равны нулю => Два интервала двуинверсно ортогональны
  53. int IsDualOrthogonal(struct Interval u, struct Interval v){
  54.     unsigned long tmpV, tmpU, x, tmpUV;
  55.     tmpUV = v.dnc | u.dnc;
  56.     tmpU = u.vec | tmpUV;
  57.     tmpV = v.vec | tmpUV;
  58.     x = tmpU ^ tmpV; // Действия аналогичные поиску обычной ортогональности
  59.     u.vec = tmpU & x; // Накладываем xor на tmpU и tmpV
  60.     v.vec = tmpV & x; // Если они не равны нулю, то двуинверсно ортогональны, иначе нет
  61.     if(u.vec != 0 && v.vec != 0) return 1;
  62.     return 0;
  63. }
  64.  
  65.  
  66.  
  67.  
  68. int main(int argc, char *argv[]) {
  69.     struct Interval S;
  70. struct Interval u;
  71.     u.vec=44;
  72.     u.dnc=81;
  73. struct Interval v;  
  74.     v.vec=164;
  75.     v.dnc=80;
  76. printf("%d\n",IsDualOrthogonal(u,v));
  77.     return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement