Loopup table in C

29/11/2007 - 18:29 von Mike | Report spam
Hi

Folgendes Problemchen:

Ich habe ein konstantes Array mit 16 Werten.
Als Input habe ich nun 4 32-bit integers.
Mit einer Schleife mochte ich nun ueber die
einzelnen Bits loopen und die 4 jeweiligen Bits
bestimmen dann den Wert den ich aus dem Lookuptable
auslese.

Das Problem das ich habe, wie kann ich das sauber in C realisieren?
Hab gedacht an Bitmasking, ungefaehr so:

int LUT[16] = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];

int A.B,C,D = rand();
int mask = 1;

int i;
int tmp;
for(i = 0; i < 32; i++) {
tmp = 8*(A & mask) + 4*(B & mask) + 2*(C & mask)+ (D & mask);
lookup_val[i] = LUT[tmp];
mask<<1;
}

Sollte so eigentlich funktionieren, gibt es vielleicht noch eine bessere
Loesung?

Danke!
 

Lesen sie die antworten

#1 Thomas Rachel
29/11/2007 - 18:41 | Warnen spam
Mike schrieb:
^^^^
Ich habe ein konstantes Array mit 16 Werten.
Als Input habe ich nun 4 32-bit integers.
Mit einer Schleife mochte ich nun ueber die
einzelnen Bits loopen und die 4 jeweiligen Bits
bestimmen dann den Wert den ich aus dem Lookuptable
auslese.

Das Problem das ich habe, wie kann ich das sauber in C realisieren?
Hab gedacht an Bitmasking, ungefaehr so:

int LUT[16] = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];



1. Falsche Syntax - Du meintest wohl {...} statt [...].
2. Das sind hoffentlich nicht die Originalwerte? Dann wàre es wohl etwas
witzlos...

Anyway,

int A.B,C,D = rand();



Wohl eher
int A=rand(),B=rand(),C=rand(),D=rand();

und srand() gehlt noch. Aber das ist vermutlich eh nur ein Beispiel...


int mask = 1;

int i;
int tmp;
for(i = 0; i < 32; i++) {
tmp = 8*(A & mask) + 4*(B & mask) + 2*(C & mask)+ (D & mask);
lookup_val[i] = LUT[tmp];
mask<<1;
}


Sollte so eigentlich funktionieren, gibt es vielleicht noch eine bessere
Loesung?



Hast Du es denn getestet?



IMHO bessere/schönere Lösung:

int mask;
int i;


for(i = 0, mask=1; i < 32; i++,mask<<1) {
int tmp = 8*!!(A & mask) + 4*!!(B & mask) + 2*!!(C & mask)+ !!(D &
mask);
lookup_val[i] = LUT[tmp];
}

Ungetestet.

Änderungen gegenüber Deiner Lösung (1 war ein Fehler Deinerseits, 2 und
3 sind Verbesserungsvorschlàge.)

1. Die !! sind wichtig, um den jeweiligen Wert, von dem nur bekannt ist,
daß er entweder ==0 oder ==mask ist, zu einem 0/1-Wert zu machen. (!
macht aus einem !=0-Wert eine 0 und aus einer 0 eine 1.)

2. Initialisierung und <<1 der mask in die for-Klammer geschrieben.
Damit wird auf den ersten Blick klar, welche Rolle diese Variablen
haben, nàmlich einen pro Schleifendurchlauf anderen Wert aufzuweisen
(ganz allgemein gesprochen).

3. int tmp-Deklaration so weit wies geht nach innen gezogen.

HTH,


Thomas

Ähnliche fragen