bits setzen
-
Hi,
gibt es einen Trick, wie man sehr schnell bestimmte Bits setzen kann (=1)?
void SetBits(unsigned short Start, unsigned short End) { unsigned short bits = 0x0000; }
Alle Werte die sich zwischen "Start" und "End" befinden sollen jetzt in der Variable "bits" gesetzt werden; z.B. Start = 2 und End = 7
-> bits = 0000 0000 1111 1100 sind gesetzt.Gruß
HansImGlück
-
Du könntest zB 2 hoch
End
nehmen, und 2 hochStart
subtrahieren. Potenzen von 2 kannst du "ershiften", das sollte auf üblichen Maschinen "sehr schnell" sein.
-
int i; for (i = Start; i <= End; i++) bits |= 1 << i;
Gez. monstermunchkin
-
monstermunchkin schrieb:
int i; for (i = Start; i <= End; i++) bits |= 1 << i;
Gez. monstermunchkin
Sei N = End - Start + 1. In deinem Fall macht man N Shifts, N binäre Oder's und N Zuweisungen. In meinem Fall macht man nur zwei Shifts, gar kein Oder, und nur eine Zuweisung, dafür auch eine Addition und eine Subtraktion:
bits = (1 << (End + 1)) - (1 << Start); // (ungetestet)
Was ist schneller?
-
µngbd schrieb:
Was ist schneller?
Die sind gleich schnell. Aber auf Deine Lösung wäre ich gar nicht gekommen
-
monstermunchkin schrieb:
µngbd schrieb:
Was ist schneller?
Die sind gleich schnell.
Hast du das gemessen?
-
monstermunchkin schrieb:
Aber auf Deine Lösung wäre ich gar nicht gekommen
Vermutlich zwei verschiedene Herangehensweisen: ich hab mir
bits
als Zahl gedacht, und die Zahlen-Operation "2 hoch x" am Ende als Bitshift geschrieben. Du hast dirbits
wahrscheinlich als Bitfeld gedacht, und die Bitfeld-Operationen verwendet.monstermunchkin schrieb:
Die sind gleich schnell.
Ich bin mir da auch nicht so sicher...
-
_matze schrieb:
monstermunchkin schrieb:
µngbd schrieb:
Was ist schneller?
Die sind gleich schnell.
Hast du das gemessen?
Nein, habe ich nicht. Ich muss dazu sagen, dass sich meine obige Aussage auf Desktop-PCs bzw. Notebooks bezieht. Da gibt es nämlich keinen großen Unterschied.
-
_matze schrieb:
Hast du das gemessen?
wie soll das gehen? 1 mio mal aufrufen und RDTSC vergleichen ist extrem unzuverlässig bei solch kleinen codes. vielleicht disassemblierern und takte pro befehl zusammenrechnen?
btw, µngbd's trick ist bestimmt schneller, zumindest immer gleich schnell.