Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdbool.h>
- struct Interval{
- unsigned long vec;// 0 - инверсия 1 - без инверсии
- unsigned long dnc; // '-'. ЧЕрточка - 1
- };
- int IsOneOrthogonal(struct Interval u, struct Interval v) {
- unsigned long tmpUV, tmpU, tmpV,x;
- tmpUV = v.dnc | u.dnc;
- tmpU = u.vec | tmpUV;
- tmpV = v.vec | tmpUV;
- x= tmpU ^ tmpV;
- x = x * 0x08040201; // Создаются 4 копии
- x = x >> 3; // Удаление соответствующих битов
- x = x & 0x11111111; // Каждый 4-й бит
- x = x * 0x11111111; // Сумма цифр (0 или 1)
- x = x >> 28; // Положение результата
- if(x==1) return 1;
- return 0;
- }
- // Функция IsDualOrthogonal проверяет два интервала на двуинверсную ортогональность и возвращает 1 - если двуинверсноортогональны, иначе - 0
- // Расммотрим пример
- // два интервала u и v
- // u = 0-1-110- v = 1-1-0100
- // dnc=01010001 dnc=01010000
- // vec=00101100 vec=10100100
- // v.dnc = 01010000 * выполняем лог.сложенте
- // u.dnc = 01010001
- // tmpUV = 01010001
- // Вектор tmpUV - маска компонент, на которые нам не нужно обращать
- // Накладываем маску на векторы
- // v.vec = 10100100 * выполняем лог.сложенте
- // tmpUV = 01010001
- // tmpV = 11110101
- //
- // u.vec = 00101100 * выполняем лог.сложенте
- // tmpUV = 01010001
- // tmpU = 01111101
- //
- // Делаем сумму по модулю между tmpU u tmpV
- //
- // tmpU = 01111101
- // tmpV = 11110101
- // x = 10001000
- //
- // tmpU & x = 01111101 & 10001000 = 00001000
- // tmpV & x = 11110101 & 10001000 = 10000000
- // Они не равны нулю => Два интервала двуинверсно ортогональны
- int IsDualOrthogonal(struct Interval u, struct Interval v){
- unsigned long tmpV, tmpU, x, tmpUV;
- tmpUV = v.dnc | u.dnc;
- tmpU = u.vec | tmpUV;
- tmpV = v.vec | tmpUV;
- x = tmpU ^ tmpV; // Действия аналогичные поиску обычной ортогональности
- u.vec = tmpU & x; // Накладываем xor на tmpU и tmpV
- v.vec = tmpV & x; // Если они не равны нулю, то двуинверсно ортогональны, иначе нет
- if(u.vec != 0 && v.vec != 0) return 1;
- return 0;
- }
- int main(int argc, char *argv[]) {
- struct Interval S;
- struct Interval u;
- u.vec=44;
- u.dnc=81;
- struct Interval v;
- v.vec=164;
- v.dnc=80;
- printf("%d\n",IsDualOrthogonal(u,v));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement