Наиболее элегантное и гибкое решение состоит в том, чтобы, как уже говорили другие, применять маску «расчески» по отдельности к четным и нечетным битам, а затем смещать их влево и вправо соответственно на одно место, чтобы объединять их, используя поразрядно или.
Еще одно решение, о котором вы можете подумать, использует относительно небольшой размер вашего типа данных.Вы можете создать справочную таблицу из 256 значений, которая статически инициализируется для значений, которые вы хотите использовать в качестве выходных данных для вашего ввода:
const unsigned char lookup[] = { 0x02, 0x01, 0x03, 0x08, 0x0A, 0x09, 0x0B ...
Каждое значение помещается в массив для представления преобразования индекса.Поэтому, если вы затем сделаете это:
unsigned char out = lookup[ 0xAA ];
out
будет содержать 0x55
Это более громоздко и менее гибко, чем первый подход (что если вы хотите перейти от 8биты до 16?), но есть подход, который будет заметно быстрее, если выполнять большое количество этих операций.