Extraer bits utilizando la manipulación de bits.

Tengo un int sin signo de 32 bits y necesito extraer bits en las posiciones dadas y hacer un nuevo número a partir de esos bits. Por ejemplo, si tengo un 0xFFFFFFFF y quiero los bits 0,10,11, mi resultado será 7 (111b).

Este es mi bash, extrae los bits correctamente pero no crea el resultado correcto. Estoy cambiando el resultado 1 lugar a la izquierda y ANDándolo con mi bit extraído, aparentemente, ¿esto es incorrecto?

También estoy seguro de que hay probablemente una forma mucho más elegante de hacer esto?

#define TEST 0xFFFFFFFF unsigned int extractBits(unsigned short positions[], unsigned short count, unsigned int bytes) { unsigned int result = 0; unsigned int bitmask = 0; unsigned short bit = 0; int i = 0; for(i = 0; i < count; i++) { bitmask = 2 <> positions[i]; result = result << 1; result = result & bit; } if(result != 31) { printf("FAIL"); } return result; } int main(void) { unsigned short positions[5] = {8, 6, 4, 2, 0}; unsigned int result = extractBits(positions, 5, TEST); printf("Result: %d\n", result); return 0; } 

Ya que está seleccionando bits individuales, no hay razón para hacer que la máscara de bits sea una variable; simplemente desplace el bit deseado al bit de unidades, y use una máscara de 1. Por ejemplo:

 ... result = (2*result) | ((bytes >> positions[i]) & 1); ... 

Muchos comstackdores generan el mismo código para 2*result y result<<1 , así que usa el que quieras.

Tenga en cuenta que si está diseñando la interfaz y no tiene buenas razones para usar enteros short para las positions[] y count como lo hace, entonces no lo haga. Sea consistente y especifique todos los enteros de la misma manera.

Cuidado, código no probado:

 for(i = 0; i < count; i++) { bitmask = 1 << positions[i]; bit = (bytes & bitmask)!=0; result = (result << 1)|bit; }