Recogiendo el guante… (pero poco a poco)

Hola!

Este artículo de phobeo me ha parecido una idea genial. Pequeños problemas para hacernos escurrir el coco e intentar hacerlo de la mejor manera posible 🙂

Así que, como indico en el título, voy a recoger el guante, pero poco a poco. Es decir, voy a exponer mi solución al segundo problema: Cómo darle la vuelta a los bits de un byte.

He decidido implementarlo usando recursividad. La idea es que el reverso es igual al reverso de la segunda mitad colocado en la primera mitad más el reverso de la primera mitad colocado en la segunda mitad. (Qué enrevesado suenaaaaa dicho con palabras… [:(] )

Bueno, un código vale más que mil palabras:

#include "stdafx.h"

#include "conio.h"

#define BYTE unsigned char

BYTE reverseChar(BYTE input, BYTE first, BYTE last);
BYTE reverse(BYTE input);

int _tmain(int argc, _TCHAR* argv[])
{
    BYTE input;
    BYTE resultado;
    int num = 0;
    int lookUp[255];

    for(int i=0; i<256; i++)
    {
        lookUp[ i ] = -1;
    }

    while(num != -1)
    {
        printf("Introduzca un numero entre 0 y 255 (-1 para terminar): ");
        scanf("%d", &num);

        if((num > -1) && (num < 256))
        {
            if(lookUp[num] == -1)
            {
                input = (BYTE) num;
                resultado = reverse(input);
                lookUp[input] = resultado;
            }
            else
            {
                resultado = (BYTE) lookUp[num];
            }

            printf("El byte dado la vuelta es: %d.n", resultado);
        }
    }

    return 0;
}

BYTE reverse(BYTE input)
{
    return reverseChar(input, 0, 7);
}

BYTE reverseChar(BYTE input, BYTE first, BYTE last)
{
    BYTE mask = 0x01;
    BYTE result = 0;
    BYTE delta;
    BYTE half1, half2;

    if(first == last - 1)
    {
        result = ((input & (mask << last)) >> 1) | ((input & (mask << first)) << 1);
    }
    else
    {
        delta = (last - first + 1) >> 1;
        
        half1 = reverseChar(input, first + delta, last);
        half2 = reverseChar(input, first, first + delta - 1);

        result = (half1 >> delta) | (half2 << delta);
    }

    return result;
}

Bueno, pues nada más por hoy. Dejo el código fuente en un ficherico zip adjunto.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *