La solución más elegante y flexible es, como otros han dicho, para aplicar una máscara 'peine' tanto a los bits pares e impares por separado y luego, después de haberlos desplazado a la izquierda y a la derecha, respectivamente, un lugar para combinarlos utilizando bitwise o.
Otra solución que quizás desee considerar aprovecha el tamaño relativamente pequeño de su tipo de datos.Puede crear una tabla de consulta de 256 valores que se estáticamente inicializado a los valores que desee como salida a la entrada:
const unsigned char lookup[] = { 0x02, 0x01, 0x03, 0x08, 0x0A, 0x09, 0x0B ...
se coloca Cada valor de la matriz para representar la transformación del índice. Así que si a continuación, hace esto:
unsigned char out = lookup[ 0xAA ];
out
contendrá 0x55
Esto es más complicado y menos flexible que el primer enfoque (lo que si quieres pasar de 8 bits a 16?) Pero tiene el enfoque de que será considerablemente más rápido si se realiza una gran cantidad de estas operaciones.
¿Cuál es la pregunta? – JamesM
Perdón por la primera respuesta que di si te confundió. Leí completamente tu antes/después mal. – colithium
@JamesM: Lo siento, si no es evidente, pero la pregunta es: en un byte, empareja los bits para, por ejemplo, si el byte es 10101100, entonces el emparejamiento de los bits se verá como '10 - 10 - 11 - 00'. Ahora, si intercambiamos los pares individuales, se convertiría en '01 - 01 - 11 - 00'. Necesitaba el mecanismo para implementar el intercambio – RaviPathak