Be', una prima assunzione non necessariamente vera che vedo nel tuo codice è che l'unsigned short sia di dimensione doppia rispetto al char.
Tra l'altro
codice:
k^=k;
è un assembly-ismo? In C, se non vuoi offuscare il codice, di solito si scrive
codice:
k=0;