Advertisement
semenrbt

dz1

Mar 12th, 2021
554
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.20 KB | None | 0 0
  1. #include <stdbool.h>
  2. #include <stdio.h>
  3. bool IsDoubleOrthogonal(unsigned long a, unsigned long b) // Подаем два вектора
  4. {
  5.     unsigned long TmpB=(a^b)&a;// Создаем вектор, где хранятся 1 в местах ортогональности
  6.     unsigned long TmpA=(a^b)&b;// Вектор, где хранятся 0 в местах ортогональности
  7.     if (TmpA && TmpB){
  8.         if(TmpA>TmpB) // Если из большего вычести 1 и сделать лог.умножение должнен появится TmpA/TmpB в случае двуинверсной орт.
  9.         {
  10.             if( (TmpA-1) & TmpB == TmpB) return true;
  11.         }
  12.         if(TmpA<TmpB){
  13.             if( (TmpB-1) & TmpA == TmpA) return true;
  14.         }
  15.     }
  16.     return false;
  17. }
  18. // a = 111001
  19. // b = 000111
  20. //TmpB=111000
  21. //TmpA=000110
  22. // TmpB>TmpA => TmpB-1 = 110111 & TmpA = TmpA
  23. // Следовательно вектор двуинверсно ортогональный
  24. // a = 1000
  25. // b = 1101
  26. //TmpB=0000
  27. //TmpA=0101
  28. // TmpB == NULL => вектор не двуинверсно орт.
  29.  
  30. int main(){
  31.  
  32.     unsigned long b=7;
  33.     unsigned long a=57;
  34.  
  35.     bool c= IsDoubleOrthogonal(a,b);
  36.     printf("%s", c?" true":"false");
  37. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement