Pues veamos lo que pasa:
Código:
struct _eq{
UINT uno: 1;
UINT dos: 7;
UINT tres: 8;
};
//---------------------------------------------------------------------------
void Fun1()
{
_eq eq;
eq.uno = 1;
eq.dos = 4;
}
//---------------------------------------------------------------------------
void Fun2()
{
WORD EQ;
EQ |= 1;
EQ &= 0xFF01;
EQ |= 4 << 1;
}
Ambos casos son equivalentes, el primero se entiende mejor y está mejor estructurado. El segundo utiliza la aritmética de bits.
El primer caso con campos de bits quedaría compilado así:
Código:
// eq.uno = 1;
or word ptr[ebp-0x34], 0x1
// eq.uno = 4;
mov dl, [ebp-0x34]
and dl, 0x1
or dl, 8
mov [ebp-0x34], dl
El segundo así:
Código:
or word ptr[ebp-0x34], 0x1
and word ptr[ebp-0x34], 0xFF01
or word ptr[ebp-0x34], 8
De esta forma, se ve que queda mejor optimizado cuando se usa aritmética de bits aunque es mas tedioso de manejar.
Si lo que prima es la velocidad, es mejor usar la aritmética binaria, en otro caso es mejor el uso de campos de bits pues son mas comprensibles y se estructura mejor el código.
Saludos.