Смещение бита можно вычислить, но это крайний случай. Мне как-то понадобилось в асм'е работать с битами из структуры (я код старался максимально ужать по скорости).
// Глобальные переменные, которые будут содержать смещение бита
// в структуре и его маску
unsigned int f1_pos, f1_mask;
// Эта функция вызывается один раз из main'а
void get_f1_pos (void)
{
struct SS ss0;
struct SS ss1;
unsigned int *p0, *p1;
ss0 = ss1;
ss0.f1 = 0;
ss1.f1 = 1;
// На данный момент ss0 и ss1 различаются только одним битом f1
p0 = (unsigned int*)&ss0;
p1 = (unsigned int*)&ss1;
while (*p0 == *p1) // Ищем слово, где структуры различаются
{
p0++;
p1++;
}
f1_mask = *p0 ^ *p1; // маска
f1_pos = (int)p0 - (int)&ss0; // позиция
}
А дальше в asm'е для адресации бита уже работал с глобальными переменными f1_pos и f1_mask.