Ho creato una funzione per impostare o cancellare un numero specifico di bit in un DWORD. La mia funzione funziona. Non ho bisogno di aiuto per farlo funzionare. Tuttavia, mi chiedo se il metodo che ho scelto di farlo sia il modo più veloce possibile.È questo il modo migliore? Campi di bit C
È piuttosto difficile per me spiegare come funziona. Esistono due array contenenti DWORD riempiti con bit sul lato sinistro e destro di DWORD (con tutti gli 1 binari). Crea una maschera con tutti i bit riempiti tranne quelli che voglio impostare o cancellare, quindi li imposta con operatori bit a bit basati su quella maschera. Sembra piuttosto complicato per un compito così semplice, ma sembra il modo più veloce con cui possa arrivare. È molto più veloce che impostarli a 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;
}
Questo è quello che stavo pensando ... ma la mia piattaforma di destinazione è i386 + – oldSkool
personalmente quando ritengo che qualcosa sia difficile da spiegare a qualcun altro lo prendo come un segnale di avvertimento. :-) Probabilmente dovresti confrontare il tuo codice e confrontarlo con l'impostazione poco a poco se non lo hai già fatto. Hai provato a usare un sindacato invece? –
sì, non mi fido dei miei benchmark usando i tick dell'orologio in Windows ... ma basandomi sul numero di istruzioni, l'impostazione bit a bit ha avuto più istruzioni sull'intera iterazione. – oldSkool