Hallo!
Angenommen ich möchte mit einer UND-Maske die n untersten bits
maskieren. n ist aber variabel und nicht fest. Wie mache ich das
effektiv?
Wege die mir einfallene
Weg 1)
Ich definiere mir die Masken als lookup table, also so
uint8_t masken[] = {0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff};
n = (...) //Aus irgendeiner Berechnung
auszumaskieren &= masken[n];
das wäre eigentlich doch recht schnell, aber bei größeren Wortbreiten
geht das durch den lookup table irgendwie in den Speicher finde ich.
Weg 2)
Ausrechnen:
auszumaskieren &= ( 2**n ) - 1;
Da habe ich nur keine Ahnung, wie lange die Berechnung 2**n eigenltich
dauert. Und da man nun eigentlich immer so schnell wie es geht bits
maskieren möchte verunsichert mich das.
Weg 3)
Was würdet ihr machen bzw. welche Tips mir geben?
John Doe schrieb:> Weg 2)> Ausrechnen:>> auszumaskieren &= ( 2**n ) - 1;
Das kommt drauf an, ob die fragliche CPU einen Barrelshifter hat oder
nicht.
Hat sie einen, dann ist das eine schnelle Operation.
Hat sie keinen, dann ist das eher langsam, weil der Compiler die
Operation als Schleife implementieren muss.
> Weg 3)>> Was würdet ihr machen
Ich würds als Lookup-Tabelle machen.
John Doe schrieb:> das wäre eigentlich doch recht schnell, aber bei größeren Wortbreiten> geht das durch den lookup table irgendwie in den Speicher finde ich.
Wieso?
Die Werte die n maximal annehmen kann sind je nach Prozessor 8, 16, 32,
64 und vielleicht maximal 128 oder 256.
Das sind kleine Tabellen.
Klaus Falser schrieb:> Das sind kleine Tabellen.
auf einen Atmel mit 512byte ram, kann das schon zu viel sein.
aber eigentlich braucht man ja nur 8 werte in der Tabelle, denn die
kleinere bits sind ja dann alle 1
mir gefällt die Methode mit dem Lookup Table und die Größe der Tables
steigt eh nur linear mit der Bitbreite, also werden die auch nicht
schnell groß.
Allerdings sollte auch:
auszumaskieren &= ( 2**n ) - 1
sehr schnell gehen, wie schon oben erwähnt, wenn der Controller einen
Barrel Shifter hat, denn daraus macht der Compiler dann:
auszumaskieren &= (1<<n) - 1
Wär interessant was der Compiler daraus macht.
Peter schrieb:> Klaus Falser schrieb:>> Das sind kleine Tabellen.>> auf einen Atmel mit 512byte ram, kann das schon zu viel sein.>>> aber eigentlich braucht man ja nur 8 werte in der Tabelle, denn die> kleinere bits sind ja dann alle 1
Außerdem müssen die nicht im RAM stehen.