Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdbool.h>
- #include <stdio.h>
- bool IsDoubleOrthogonal(unsigned long a, unsigned long b) // Подаем два вектора
- {
- unsigned long TmpB=(a^b)&a;// Создаем вектор, где хранятся 1 в местах ортогональности
- unsigned long TmpA=(a^b)&b;// Вектор, где хранятся 0 в местах ортогональности
- if (TmpA && TmpB){
- if(TmpA>TmpB) // Если из большего вычести 1 и сделать лог.умножение должнен появится TmpA/TmpB в случае двуинверсной орт.
- {
- if( (TmpA-1) & TmpB == TmpB) return true;
- }
- if(TmpA<TmpB){
- if( (TmpB-1) & TmpA == TmpA) return true;
- }
- }
- return false;
- }
- // a = 111001
- // b = 000111
- //TmpB=111000
- //TmpA=000110
- // TmpB>TmpA => TmpB-1 = 110111 & TmpA = TmpA
- // Следовательно вектор двуинверсно ортогональный
- // a = 1000
- // b = 1101
- //TmpB=0000
- //TmpA=0101
- // TmpB == NULL => вектор не двуинверсно орт.
- int main(){
- unsigned long b=7;
- unsigned long a=57;
- bool c= IsDoubleOrthogonal(a,b);
- printf("%s", c?" true":"false");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement