補足、shortなどsignを含む変数を>>シフト演算子で処理すると、算術シフトが用いられ最上位bitを引きずります。
算術シフトの例)0x8001>>1→0xc000
この技をあえて使う事もあります。

unsignedの場合は論理シフトが用いられ最上位ビットにはゼロが補われます。
論理シフトの例)0x8001>>1→0x4000
よってシフト前にマスクするよりもシフト後にマスクした方がより安全なコードとなり得ます。
エンディアンが固定で分かっていれば、short型変数のアドレスをchar*でアクセスした方が実行速度は速いかもしれません。