Brainer: Nu med C

fre apr 10, 2009 (Axcon)

Morten påstår at han aldrig ville have skrevet det her kode sådan :-)

Der er indtil flere ting galt. Du finder garanteret hurtigt det, der har med performance at gøre; men der er faktisk en detalje, der gør, at det en sjælden gang imellem ikke vil virke. Hvilken?

For at spare dig tid med at gennemskue, hvad funktionen skal gøre, er her en kort beskrivelse: Funktionen tager en 32 bit unsigned integer som input og giver en 32 bit unsigned integer som output. Input og output deles op i fire bytes. Input oversættes til output ved at hver byte oversættes via en lookup tabel:

#include <stdint.h>
const uint8_t lookup_table[256] = {  };
uint32_t translate(uint32_t x)
{
  uint32_t ret;
  uint8_t *input  = (uint8_t *) &x;
  uint8_t *output = (uint8_t *) &ret;
  *output++ = lookup_table[*input++];
  *output++ = lookup_table[*input++];
  *output++ = lookup_table[*input++];
  *output++ = lookup_table[*input++];
  return ret;
}

Kan du gennemskue, hvad der gør, at det ikke altid vil virke, så giv et svar på mailen. Som sædvanlig er der stor hæder på højkant.

Hvad mener du?