Para acceder aleatoriamente a bits individuales, la macro que ha sugerido es tan buena como la que obtendrá (siempre que active las optimizaciones en su compilador).
Si hay algún patrón en los bits a los que está accediendo, entonces es posible que pueda hacerlo mejor. Por ejemplo, si accede con frecuencia a pares de bits, puede ver algunas mejoras al proporcionar un método para obtener dos bits en lugar de uno, incluso si no siempre termina utilizando ambos bits.
Al igual que con cualquier problema de optimización, deberá familiarizarse con el comportamiento de su código, en particular sus patrones de acceso en su matriz de bits, para lograr una mejora significativa en el rendimiento.
Actualización: Dado que accede a rangos de bits, probablemente pueda obtener más rendimiento de sus macros. Por ejemplo, si necesita acceder a cuatro bits es posible que tenga macros como este:
#define GETBITS_0_4(x,in) (((in)[(x)/8] & 0x0f))
#define GETBITS_1_4(x,in) (((in)[(x)/8] & 0x1e) >> 1)
#define GETBITS_2_4(x,in) (((in)[(x)/8] & 0x3c) >> 2)
#define GETBITS_3_4(x,in) (((in)[(x)/8] & 0x78) >> 3)
#define GETBITS_4_4(x,in) (((in)[(x)/8] & 0xf0) >> 4)
#define GETBITS_5_4(x,in) ((((in)[(x)/8] & 0xe0) >> 5) | (((in)[(x)/8+1] & 0x01)) << 3)
#define GETBITS_6_4(x,in) ((((in)[(x)/8] & 0xc0) >> 6) | (((in)[(x)/8+1] & 0x03)) << 2)
#define GETBITS_7_4(x,in) ((((in)[(x)/8] & 0x80) >> 7) | (((in)[(x)/8+1] & 0x07)) << 1)
// ...etc
Estas macros se recortar cuatro bits de cada posición de bit 0, 1, 2, etc. (Para reducir la proliferación de paréntesis, sin sentido, es posible que desee utilizar las funciones en línea de los anteriores) Entonces, tal vez definir una función en línea como:.
inline int GETBITS_4(int x, unsigned char *in) {
switch (x % 8) {
case 0: return GETBITS_0_4(x,in);
case 1: return GETBITS_1_4(x,in);
case 2: return GETBITS_2_4(x,in);
// ...etc
}
}
como se trata de una gran cantidad de código repetitivo tedioso, especialmente si usted tiene múltiples anchuras diferentes , es posible que desee escribir un programa para generar todas las funciones de acceso GETBIT_*
.
(Noto que los bits en los bytes se almacenan en el orden inverso de lo que he escrito anteriormente. Aplicar una transformación adecuada para que coincida con su estructura si es necesario.)
Sé que hay alguna variación en el número de bits por char, pero 256 bits por char es un _lot_. – MSalters
MSalters: gracias, arreglado. –