Non ci avrei mai pensato, l'operatore ternario sul printf è chiaro, il for impostato così mi crea difficoltà, dovrei provare con il debug, questo è quello che leggo: (int i = 0x8000 (valore iniziale di i); i (>0 è sottointeso); i>>=1 (shift a destra e assegna))
Vado per ragionamento, il valore binario di 0x8000 è: 1000000000000000 con i>>=1, sposti l'uno di un posto verso destra usi i per mascherare il bit voluto (solo zero è false) e il ciclo continua finquando l'uno scompare, a quel punto i non è più maggiore di zero, e il ciclo finisce.
In questo modo lavori direttamente sui bit senza dover fare nessuna conversione