Чтоб немного облегчить себе и другим жизнь для проверки, установки или очистки бит в байте (слове и т.д.) очень наглядно пользоваться масками, но не такими как 0х80, а допустим как (1<<7). Порядок следования бит в языке СИ и С++, да и наверное и во всех прочих языках высокого уровня (???), всегда одинаков: самый правый бит №0 (LSB) - младший, самый левый бит (MSB) - старший. И это позволяет в немалой степени абстрагироваться от аппаратной особенности распределения бит и байт на той или иной платформе.
Код
uint16_t x = 0;
x |= (1<<0); // установить бит номер 0
x ^= (1<<0); // инвертировать бит номер 0
if (x&(1<<13)) {..} // проверить установлен ли бит номер 13
Естественно, никто не мешает пойти и ещё дальше и обернуть всё это в макросы.
А для вычленения байт я использую такие макросы (они на мой взгляд самые удобные и не запутанные):
Код
#define BYTE0(X) ((unsigned char)((X)>>0U))
#define BYTE1(X) ((unsigned char)((X)>>8U))
#define BYTE2(X) ((unsigned char)((X)>>16U))
#define BYTE3(X) ((unsigned char)((X)>>24U))