semenrbt

25/03

Mar 12th, 2021 (edited)
660
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.89 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.  
  10.  
  11. // Функция IsEqual проверяет два интервала на равенство, если они равны, то функция возвращает true, игаче false
  12. // Расммотрим пример
  13. // два интервала u и v
  14. // u = 0-1-110-         v = 1-1-0100
  15. // dnc=01010001         dnc=01010000
  16. // vec=00101100         vec=10100100
  17. //     01111101  не равен   11110100 Следовательно возвращаем false
  18.  
  19. bool IsEqual(struct Interval u, struct Interval v) {
  20.     if(u.vec | u.dnc == v.vec | v.dnc) return true;
  21.     return false;
  22. }
  23.  
  24.  
  25. // Функция IsOrthogonal Проверяет два интервала на ортогональность
  26. // Получает на вход struct Interval u, struct Interval v
  27. // На выходе получаем int = 1 - если два интервала ортогональны
  28. // int = 0 - если два интервала неортогональны
  29. // Расммотрим пример
  30. // два интервала u и v
  31. // u = 0-1-110-         v = 1-1-0100
  32. // dnc=01010001         dnc=01010000
  33. // vec=00101100         vec=10100100
  34. // v.dnc = 01010000 * выполняем лог.сложенте
  35. // u.dnc = 01010001
  36. // tmpUV = 01010001
  37. //  Вектор tmpUV - маска компонент, на которые нам не нужно обращать
  38. // Накладываем маску на векторы
  39. // v.vec = 10100100 * выполняем лог.сложенте
  40. // tmpUV = 01010001
  41. // tmpV  = 11110101
  42. //
  43. // u.vec = 00101100 * выполняем лог.сложенте
  44. // tmpUV = 01010001
  45. // tmpU  = 01111101
  46. //
  47. // Делаем сумму по модулю между tmpU u tmpV
  48. //
  49. // tmpU  = 01111101
  50. // tmpV  = 11110101
  51. //  Otvet =10001000  != 0  Следовательно интервалы ортогональны
  52. // Если посмотреть на эти интервалы, то действительно - они ортогональны
  53. int IsOrthogonal(struct Interval u, struct Interval v) {
  54.     unsigned long tmpUV, tmpU, tmpV;
  55.     tmpUV = v.dnc | u.dnc;
  56.     tmpU = u.vec | tmpUV;
  57.     tmpV = v.vec | tmpUV;
  58.  
  59.     if ((tmpU ^ tmpV) != 0) return 1;
  60.     return 0;
  61. }
  62. // Функция, которая проверяет на пересечение два интервала "u" и "v"
  63. // Расммотрим пример
  64. // два интервала u и v
  65. // u = 0-1-110-         v = 1-1-0100
  66. // dnc=01010001         dnc=01010000
  67. // vec=00101100         vec=10100100
  68. //tmpU=01111101        tmpV=11110100
  69. // Пересечение
  70. // tmpU=01111101
  71. // tmpV=11110100
  72. //Otvet=01110100 != 0 следовательно интервалы пересекаются => int = 1;
  73.  
  74. int Cross(struct Interval u, struct Interval v){
  75.     unsigned long tmpU, tmpV;
  76.     tmpU = u.vec | u.dnc; // Накладываем dnc и vec, интервала для поиска пересечения двух интервалов
  77.     tmpV = v.vec | v.dnc;
  78.     if(tmpU & tmpV) return 1; // Если пересечение двух массок не равно 0, то интервалы пересекаются
  79.     return 0; // Если tmpU & tmpV == NULL , то интервалы не пересекаются
  80. }
  81.  
  82.  
  83. // Функция Merging которая ищет пересечение двух интервалов и записывает по адресу S
  84. // Функция аналогична фун-ии Cross, только нужно полученные данные преобразовать в новый интервал
  85. // Расммотрим пример
  86. // два интервала u и v
  87. // u = 0-1-110-         v = 1-1-0100
  88. // dnc=01010001         dnc=01010000
  89. // vec=00101100         vec=10100100
  90. //tmpU=01111101        tmpV=11110100
  91. // Пересечение
  92. // tmpU=01111101
  93. // tmpV=11110100
  94. //tmpUV=01110100
  95. // Ищем dnc нового вектора
  96. // 
  97. // u.dnc | v.dnc = 01010001 | 01010000 = 01010001 &
  98. //                                 tmpUV=01110100
  99. //                              (*S).dnc=01010000
  100. // Совершаем сумму по модулю, чтобы найти Vec
  101. // (*S).dnc=01010000
  102. //    tmpUV=01110100
  103. // (*S).vec=00100100
  104. void Merging(struct Interval u, struct Interval v, struct Interval *S){
  105.     unsigned long tmpUV, tmpU, tmpV;
  106.     tmpU= u.dnc | u.vec;
  107.     tmpV= v.dnc | v.vec;
  108.     tmpUV= tmpU & tmpV;
  109.     (*S).dnc= tmpUV & (u.dnc | v.dnc);
  110.     (*S).vec=  (*S).dnc ^ tmpUV;
  111.     return;
  112. }
  113.  
  114.  
  115.  
  116. // Функция IsOneOrthogonal Проверяет два интервала на ортогональность по одной переменной
  117. // Получает на вход struct Interval u, struct Interval v
  118. // На выходе получаем int = 1 - если два интервала ортогональны
  119. // int = 0 - если два интервала неортогональны или ортогональны, но больше, чем по одной переменной.
  120. // Действия и логика аналогичные функции IsOrthogonal, только в конце функции мы совершаем подсчет компонент =1
  121. // И если кол-во компонент равных единицы равно 1, то интервалы ортогональны по одной переменной. Возвращаем int = 1 - Правда
  122. // Иначе возвращаем 0 - ложь
  123. // Расммотрим пример
  124. // два интервала u и v
  125. // u = 0-1-110-         v = 1-1-0100
  126. // dnc=01010001         dnc=01010000
  127. // vec=00101100         vec=10100100
  128. // v.dnc = 01010000 * выполняем лог.сложенте
  129. // u.dnc = 01010001
  130. // tmpUV = 01010001
  131. //  Вектор tmpUV - маска компонент, на которые нам не нужно обращать
  132. // Накладываем маску на векторы
  133. // v.vec = 10100100 * выполняем лог.сложенте
  134. // tmpUV = 01010001
  135. // tmpV  = 11110101
  136. //
  137. // u.vec = 00101100 * выполняем лог.сложенте
  138. // tmpUV = 01010001
  139. // tmpU  = 01111101
  140. //
  141. // Делаем сумму по модулю между tmpU u tmpV
  142. //
  143. // tmpU  = 01111101
  144. // tmpV  = 11110101
  145. //    x =  10001000
  146. // После подсчета битов x = 2 Следовательно вернем int = 0;
  147. int IsOneOrthogonal(struct Interval u, struct Interval v) {
  148.     unsigned long tmpUV, tmpU, tmpV,x;
  149.     tmpUV = v.dnc | u.dnc;
  150.     tmpU = u.vec | tmpUV;
  151.     tmpV = v.vec | tmpUV;
  152.     x= tmpU ^ tmpV;
  153.     x = x * 0x08040201; // Создаются 4 копии
  154.     x = x >> 3; // Удаление соответствующих битов
  155.     x = x & 0x11111111; // Каждый 4-й бит
  156.     x = x * 0x11111111; // Сумма цифр (0 или 1)
  157.     x = x >> 28; // Положение результата
  158.     if(x==1) return 1;
  159.     return 0;
  160. }
  161. // Функция IsAbsorb проверяет интервалы на поглощение
  162. // Если поглощает то функция возвращает true
  163. // Иначе false
  164. // Расммотрим пример
  165. // два интервала u и v
  166. // u = 0-1-110-         v = 1-1-0100
  167. // dnc=01010001 |       dnc=01010000 |
  168. // vec=00101100         vec=10100100
  169. //tmpU=01111101        tmpV=11110100 | 01010001 = 11110101
  170. // tmpU != tmpV Следовательно поглащения нет
  171. bool IsAbsorb(struct Interval u, struct Interval v) {
  172.     unsigned long tmpUV, tmpU, tmpV;
  173.     tmpU = u.vec | u.dnc;
  174.     tmpV = v.vec | v.dnc | u.dnc;
  175.     if (tmpU == tmpV)
  176.     return true;
  177.     return false;
  178. }
  179.  
  180.  
  181. int main(int argc, char *argv[]) {
  182.     struct Interval S;
  183.     struct Interval u;
  184.         u.vec=44;
  185.         u.dnc=81;
  186.     struct Interval v;  
  187.         v.vec=164;
  188.         v.dnc=80;
  189.     // -1-000-0
  190.     Merging(u,v,&S);
  191.  
  192.     //printf("%d\n",IsOneOrthogonal(u,v));
  193.     //Cross(u,v,p_S);
  194.     printf("%d \n %d \n",S.vec,S.dnc);
  195.     return 0;
  196. }
  197.    
  198.  
Add Comment
Please, Sign In to add comment