Konrad Rudolph schrieb:
Xin schrieb:
Das erkläre mir mal, wie man den Bereich eines Bytes - also 256 Möglichkeiten - mit einem einzigen Zugriff abdeckt, ich lerne gerne dazu.
unsigned int const POW_2_FLOOR_TABLE[] = {
0, 1, 2, 2, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
// …
};
unsigned int pow_2_floor(unsigned int value)
{
return POW_2_FLOOR_TABLE[value];
}
*lach* Okay, Du gewinnst.
Ich war fest von einem Algorithmus ausgangen und dachte, Du wolltest auf Switch hinaus.
Manchmal sieht man den Wald vor lauter Bäumen nicht. ^^
In Kombination mit der binären Suche - welches Byte an die Tabelle übergeben - kommt man so auf 3 konstante Abfragen runter. Ziemlich gut.
Konrad Rudolph schrieb:
Xin schrieb:
Ich mache mich ungern vom Compiler abhängig.
Sicher, das ist verständlich.
Auf der anderen Seite gibt es einfach gewisse Mindestanforderungen, die man an einen modernen Compiler stellen kann und auch stellen *sollte*. IMHO gehören einige billige Optimierungstechniken dazu; die von mir verwendete Form der Endrekursion ist absolut trivial optimierbar. Daher setze ich sie voraus.
Es gibt auch gewisse Mindestanforderungen, die man an den Programmierer setzen darf.