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