Programancia101

Seguro que este será uno de los blogs (Programancia101) que más asiduamente leeré, lo primero por que estoy seguro de que va ha ser divertido y además es de un tipo al que considero un crack (Ricardo Varela).. en fin no ha hecho más que empezar... dije que: si tenia tiempo trataría de hacer una versión optimizada, aun así creo que se puede hacer mejor. Entre otras cosas, me a servido para usar los punteros en .Net cosa que no tocaba desde mis tiempos C/C++

Bueno, aprovecho para felicitaros la navidad y la llegada del próximo año.

public unsafe float ReverseFloat(float f)
        {
            int* ip = (int *)&f;
            int ff = 0;
 
            // Descomponemos el float
           
            // signo - bit 31
            int s = ((*ip >> 31) == 0) ? 0 : 1;
            // exp - 
            int e = ((*ip >> 23) & 0xFF);            
            // mantissa
            int m = (*ip & 0x007fffff);
 
            // reversamos 
            //s = ~s;
            e = ReverseBits(e, 8);
            m = ReverseBits(m, 23);
 
            // montamos de nuevo el float
            ff |= s << 31;
            ff |= e << 23; 
            ff |= m;
 
            // evitamos casts
            float* fp = (float*)&ff;
            return *fp;
        }
 public int ReverseBits(int i, int bits)
        {
            int reverse = 0;
            while (bits-- > 0)
            {
                reverse <<= 1;
                reverse = reverse + (i & 1);
                i >>= 1;
            }
            return reverse;
        } 
Published 29/12/2006 12:49 por Carlos Segura
Archivado en:
Comparte este post: