У Вас в темі bit, а в тексті byte, через це можуть бути розбіжності.
koala показав, як виділити молодші біти молодшого та старшого байту.
Якщо в unsigned short пакували саме bool, то там по стандарту саме 0 та 1 лише і можуть бути, але якщо пакували байти, які «будемо розглядати як bool», то такої гарантії нема.
байти (8-бітові порції) виділяти так:
unsigned char lo_byte = x & 0xFF;
unsigned char hi_byte = (x >> 8) & 0xFF;
А саме high order bit з unsigned short більш-менш «портабельно» можна виділити так:
#include <limits.h>
// USHRT_MAX має всі одинички на кількість бітів unsigned short
#define USHORT_HI_BIT_MASK ((unsigned short) ~(USHRT_MAX >> 1))
// або так, через бітову довжину
#define USHORT_HI_BIT_MASK (1U << (sizeof(unsigned short)*CHAR_BITS - 1))
Взагалі коли починає хотітися в С наворотити щось залежне від реальних розмірів змінних (я не маю на увазі роботу з апаратурою та stdint.h), то у переважній більшості випадків краще подумати і не робити такого (от навіщо пакувати два bool у short?).