Ver Mensaje Individual
  #4  
Antiguo 05-12-2009
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Reputación: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.

Última edición por escafandra fecha: 05-12-2009 a las 18:47:08.
Responder Con Cita