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;
        } 

Deja un comentario

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