Hice una función para establecer o borrar un número específico de bits en un DWORD. Mi función funciona No necesito ayuda para hacerlo funcionar. Sin embargo, me pregunto si el método que elegí para hacerlo es la manera más rápida posible.¿Es esta la manera más óptima? C bitfields
Es bastante difícil para mí explicar cómo funciona esto. Hay dos matrices que contienen DWORD que están llenas de bits en el lado izquierdo y derecho de DWORD (con todos los 1 binarios). Hace una máscara con todos los bits rellenos, excepto los que quiero establecer o borrar, y luego los establece con operadores bit a bit basados en esa máscara. Parece bastante complicado para una tarea tan simple, pero parece ser la manera más rápida que pude llegar. Es mucho más rápido que configurarlos poco a poco.
static DWORD __dwFilledBitsRight[] = {
0x0, 0x1, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF, 0xFFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF
};
static DWORD __dwFilledBitsLeft[] = {
0x0, 0x80000000, 0xC0000000, 0xE0000000, 0xF0000000, 0xF8000000, 0xFC000000, 0xFE000000, 0xFF000000, 0xFF800000, 0xFFC00000, 0xFFE00000, 0xFFF00000, 0xFFF80000, 0xFFFC0000, 0xFFFE0000, 0xFFFF0000, 0xFFFF8000, 0xFFFFC000, 0xFFFFE000, 0xFFFFF000, 0xFFFFF800, 0xFFFFFC00, 0xFFFFFE00, 0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0, 0xFFFFFFE0,
0xFFFFFFF0, 0xFFFFFFF8, 0xFFFFFFFC, 0xFFFFFFFE, 0xFFFFFFFF
};
// nStartBitFromLeft must be between 1 and 32...
// 1 is the bit farthest to the left (actual bit 31)
// 32 is the bit farthest to the right (actual bit 0)
inline void __FillDWORDBits(DWORD *p, int nStartBitFromLeft, int nBits, BOOL bSet)
{
DWORD dwLeftMask = __dwFilledBitsLeft[nStartBitFromLeft - 1]; // Mask for data on the left of the bits we want
DWORD dwRightMask = __dwFilledBitsRight[33 - (nStartBitFromLeft + nBits)]; // Mask for data on the right of the bits we want
DWORD dwBitMask = ~(dwLeftMask | dwRightMask); // Mask for the bits we want
DWORD dwOriginal = *p;
if(bSet) *p = (dwOriginal & dwLeftMask) | (dwOriginal & dwRightMask) | (0xFFFFFFFF & dwBitMask);
else *p = (dwOriginal & dwLeftMask) | (dwOriginal & dwRightMask) | 0;
}
Eso es lo que estaba pensando ... pero mi plataforma de destino es i386 + – oldSkool
personalmente cuando siento que algo es difícil de explicar a alguien más, lo tomo como una señal de advertencia. :-) Probablemente deberías comparar tu código y compararlo con configuración poco a poco si aún no lo has hecho. ¿Has intentado usar una unión en su lugar? –
Sí, no confío en mis puntos de referencia usando los ticks de reloj en Windows ... pero según el número de instrucciones, la configuración bit por bit tenía más instrucciones sobre la iteración completa. – oldSkool