Reprezentacja zmiennych - wytłumaczenie logiki

0

Znalazłem na stacku ciekawą funkcję do reprezentacji zmiennych w C. Za nic w świecie nie mogę pojąć logiki co się dzieje na każdej lini kodu. Mógłby mi ktoś pomóc? Znam podstawy wskaźników ale tutaj kompletnie nie rozumiem ich zastosowania.


void printBits(size_t const size, void const * const ptr)
{
    unsigned char *b = (unsigned char*) ptr;
    unsigned char byte;
    int i, j;

    for (i=size-1;i>=0;i--)
    {
        for (j=7;j>=0;j--)
        {
            byte = (b[i] >> j) & 1;
            printf("%u", byte);
        }
    }
    puts("");
}
int main(int argv, char* argc[])
{
        int i = 23;

        printBits(sizeof(i), &i);
        return 0;
}
1

Po kolei, "i" to integer więc jego rozmiar (sizeof) to 4 (i to wysyłasz do funkcji, jako pierwszy argument). Jako drugi wysyłasz adres liczby (integera) "i" - 32-dwu bitowy adres 32-dwu bitowego integera, a wysyłane jest jako pointer typu void. Potem tą linijką:

unsigned char *b = (unsigned char*) ptr;

nasz 32 bitowy int jest "wyciagany" z adresu i rzutowany na tablicę unsigned char - czyli od 0 do 255, czyli 8 bitów, czyli jeden bajt; i ta tablica ma cztery elementy i to się zgadza bo sizeof(int) = 4.
Linia:

byte = (b[i] >> j) & 1;

przesuwa tak pojedyncze bity, kolejnego bajtu, że jak bit jest zapalony to go drukuje, a jak nie to drukuje zero - co w sumie daje ci zapis binarny liczby w 32-dwu bitach.
Tutaj jest info o wszystkich operatorach:
https://www.tutorialspoint.com/cprogramming/c_operators.htm

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