Program nie jest tak trudny, jak wygląda. Even i odd jest sumą reprezentującą liczbę decymalnie (chociaż wg mnie powinny być zamienione bo odd przechowuje tutaj zapis na parzystych pozycjach (licząc od tyłu) a even - nieparzystych). Ale do rzeczy:
W linii 16, x%2 zwraca tak na prawdę ostatnią cyfrę liczby zapisanej binarnie. Jeżeli jest nieparzysta - wynikiem będzie 1, jeżeli parzysta - 0. Potem mnożysz to przez 2^q, gdzie q będzie pozycją w zapisie binarnym, zmiennych even i odd.
W linii 17 dzieląc liczbę przez 2, przesuwasz ją o jedno miejsce w prawo (ze względu, że jest to int, część dziesiętna będzie "odcięta").
W linii 18, robisz to samo co w linii 16 tylko dodajesz do zmiennej odd.
W linii 19, znów przesuwasz liczbę w prawo.
W linii 20. zwiększasz numer pozycyjny o 1, dla zmiennych even i odd. To wszystko wykonujesz do czasu aż q nie będzie większe bądź równe 32 (32 numery pozycyjne w zmiennych even i odd) - według mnie wystarczyłoby do 16, bo int ma pojemność 4 bajtów, a za każdą iteracją pętli "przesuwasz" tak naprawdę x o 2 miejsca w prawo.
Edit: to jest wytłumaczenie (trochę skomplikowane) tego jak działa ten algorytm co wstawiles