Wytłumaczę tylko największe magie, bo z resztą chyba sobie poradzisz.
i<<=1;
Przesunięcie bitowe. Przesuwasz wszystkie bity w lewo o 1 pozycję. Gdybyś napisał "i>>n", to było by to przesunięcie w prawo o n bitów. "i<<=n" jest równoważne z operacją i = i * 2 ^ n, a "i>>=n" będzie oznaczało i = i / 2 ^ n. Tylko nie myśl, żeby to zawsze traktować, jako takie obliczenie, bo przede wszystkim trzeba pamiętać, że jest to przesunięcie np.
char i = 0b00110110;
i <<= 3;
cout<<i<<"\n"; \\0b10110000
i >>= 5;
cout<<i<<"\n";\\0b00000101
Bity, które się nie miszczą są obcinane.
if ((b&i) != 0) { result *= x; result %= 10; }
Magia jest tu głównie z operatorem "&". Jest to AND, ale bitowe, czyli bierze pod uwagę karzdy bit oddzielnie.
Przykład:
char a = 0b01010110;
char b = 0b10001011;
char c = a&b; \\c = 0b00000010
Zauważ, że 1 jest tylko tam, gdzie w obu liczbach było 1, co zatym idzie możesz mieć np. taki przypadek:
char a = 0b01010110;
char b = 0b10000001;
char c = a&b; \\c = 0b00000000
Zmienna c została wyzerowana mimo, że obie wartości były różne od 0, więc nie można tego utożsamiać z &&.
W parze z tym operatotem często spotyka się też "|". Jest to OR bitowe. Nożesz tego użyć np. do ustawienia flag, które mówią, czy coś jest czy czegoś niema. Ustawiasz bity operatorem "|", a sprawdzasz "&". Takie coś jest też czasem nazywane maskowaniem. Dużo tego można znaleźć w WinAPI.