Interpretacja makr

0

Witajcie,

Proszę was o poprawienie mojej interpretacji makr i pomoc w interpretacji nieznanych.

Pierwsze:
#define TAG0(p) ((int)((INT_PTR)(p) & 0x1))

-iloczyn bitowy (p) & 0x1- więc jeżeli p(lsb) =1 to po iloczynie p(lsb) =1 a p(lsb) =0 to po iloczynie p(lsb) =0
-rzutowanie na typ INT_PTR - ((INT_PTR)(p) & 0x1)
-następnie rzutowanie na typ int - (int)((INT_PTR)(p) & 0x1)

Drugie:
#define BDD_IS_OUTPOS(f) (!TAG0(f))

  • wywołanie poprzedniego makro z negacją, wiec wynikiem czego jest ... co?

Trzecie:
funkcja(f)|= (1<<BDD_IS_OUTPOS(f));
-...?

Dzięki za pomoc.

Pozdrawiam
M

2

Nie do końca.

`(INT_PTR)(p) & 0x1`

Pierw wykonujesz cast na INT_PTR, a dopiero potem wywołujesz binarny operator&. Tutaj uwaga: zależnie od tego, czym jest INT_PTR, jest to dozwolone lub nie. Jeśli jest to wskaźnik, to w tym momencie masz UB - nie wolno wykonywać operacji bitowych na wskaźnikach.
Tutaj tak naprawdę sprawdzasz, czy p jest parzyste, "zwracając" 1 jeśli nie jest.
Następnie rzutujesz wynik na int.

#define BDD_IS_OUTPOS(f) (!TAG0(f))

Skoro TAG0(f) zwraca 1 jeśli f nie jest parzyste (inaczej mówiąc ma ustawiony pierwszy/ostatni bit), to !TAG0(f) zwróci true jeśli f jest parzyste, a w przeciwnym wypadku false. W C wynikiem byłoby odpowiednio 1 i 0.

funkcja(f)|= (1<<BDD_IS_OUTPOS(f));

true i false zwrócone przez BDD_IS_OUTPOS(f) są niejawnie konwertowane odpowiednio do 1 i 0 (w C nie ma żadnej konwersji). 1<<0 to 1, 1<<1 to 2. wobec tego lvalue funkcja(f) ma ustawiony bit pierwszy/ostatni lub drugi/przedostatni w zależności od tego, czy f jest parzyste.

0

Dziękuję za pomoc. To wiele wyjaśnia.

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1