У вас есть две 16-битные секции (первые три поля и последние три поля 16-битные).
Это всего 65536 записей. Так что имейте таблицу поиска, которая содержит версию полей с инвертированным битом. Оберните структуру в объединение с другой структурой, которая имеет два 16-битных поля, чтобы сделать это проще?
Что-то вроде (не проверено, я не рядом с компилятором C):
union u {
struct {
unsigned int b1:1;
unsigned int b2:8;
unsigned int b3:7;
unsigned int b4:8;
unsigned int b5:7;
unsigned int b6:1;
} bits;
struct {
uint16 first;
uint16 second;
} words
} ;
unit16 lookup[65536];
/* swap architectures */
void swapbits ( union u *p)
{
p->words.first = lookup[p->words.first];
p->words.second = lookup[p->words.second];
}
Заполнение таблицы поиска, оставленной в качестве упражнения для читателя:)
Однако внимательно прочитайте документацию по вашему компилятору. Я не уверен, требует ли стандарт C, чтобы эта структура вписывалась в слово (хотя я бы ожидал, что это сделает большинство компиляторов).