Lassen sich Integer-Zahlen bitweise auslesen?
-
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Lassen sich Integer-Zahlen bitweise auslesen?
Hallo Leute,
gibt es eine schnelle Methode, mit der man z.B. das 3. Bit einer Integer-Zahl auslesen kann?
Also z.B., wenn man die Zahl z=300 hat, hat diese die Binärdarstellung z=100101100.
Wie lässt sich also z.B. das 3. Bit auslesen? (im Beispiel wäre das also eine 1).
Viele Grüße. Euklid
gibt es eine schnelle Methode, mit der man z.B. das 3. Bit einer Integer-Zahl auslesen kann?
Also z.B., wenn man die Zahl z=300 hat, hat diese die Binärdarstellung z=100101100.
Wie lässt sich also z.B. das 3. Bit auslesen? (im Beispiel wäre das also eine 1).
Viele Grüße. Euklid
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Lassen sich Integer-Zahlen bitweise auslesen?
Code: Alles auswählen
result:= z and (1 shl 3 ) <> 0;
Code: Alles auswählen
result:= z and bits[bitnummer] <> 0;
Code: Alles auswählen
result:= checkbit(z,bitnummer);
-
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Re: Lassen sich Integer-Zahlen bitweise auslesen?
Vielen Dank, mse! Hast uns einen großen Schritt weitergeholfen...mse hat geschrieben:Mit einer Tabelle für die Bitmasken gehts für variable Bitnummer eventuell etwas schneller. Mit der unit msebits:Code: Alles auswählen
result:= z and (1 shl 3 ) <> 0;
oderCode: Alles auswählen
result:= z and bits[bitnummer] <> 0;
Code: Alles auswählen
result:= checkbit(z,bitnummer);

-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Lassen sich Integer-Zahlen bitweise auslesen?
Hmm, für dein konkretes Beispiel wohl eher
Code: Alles auswählen
result:= z and (1 shl (3-1) ) <> 0;
-
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Re: Lassen sich Integer-Zahlen bitweise auslesen?
War dank deines Beitrags und die daraufhin erfolgreiche Verwendung der Foren-Suche auf folgende Seite gelangt, die meine nächsten Fragen gleich mitbeantwortete:
http://www.hu.freepascal.org/lists/fpc- ... 10113.html" onclick="window.open(this.href);return false;
Viele Grüße, Euklid
http://www.hu.freepascal.org/lists/fpc- ... 10113.html" onclick="window.open(this.href);return false;
Viele Grüße, Euklid
- Garfield
- Beiträge: 173
- Registriert: Do 5. Jun 2008, 22:07
- OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
- CPU-Target: 64Bit
- Wohnort: Aken
Re: Lassen sich Integer-Zahlen bitweise auslesen?
Seid Ihr Euch sicher, dass es shl ist? Ich würde shr nehmen.
Code: Alles auswählen
Bit: 7 6 5 4 3 2 1 0
0 0 0 0 0 1 0 0
shl 2: <- 0 0 0 1 0 0 x x
shr 2: -> x x 0 0 0 0 0 1
Gruß Garfield
-
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: Lassen sich Integer-Zahlen bitweise auslesen?
Öhm dein Beispiel zeigt aber, dass shl richtig ist. Shiftest du "1" um 2 nach links, hast du das dritte Bit auf "1", alle anderen "0". Und das ist ja genau das Erwünschte, um auf ein bestimmtes Bit zu prüfen (mit and-operator).
- Garfield
- Beiträge: 173
- Registriert: Do 5. Jun 2008, 22:07
- OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
- CPU-Target: 64Bit
- Wohnort: Aken
Re: Lassen sich Integer-Zahlen bitweise auslesen?
Hitman hat geschrieben:Shiftest du "1" um 2 nach links, hast du das dritte Bit auf "1", alle anderen "0".

Gruß Garfield
-
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: Lassen sich Integer-Zahlen bitweise auslesen?
Öh ja. Aber die shiften die Zahl 1 - also 00000001b - um zwei nach links. Und das ist 00000100b. Also das dritte Bit.
- Garfield
- Beiträge: 173
- Registriert: Do 5. Jun 2008, 22:07
- OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
- CPU-Target: 64Bit
- Wohnort: Aken
Re: Lassen sich Integer-Zahlen bitweise auslesen?
Au.Hitman hat geschrieben:Öh ja. Aber die shiften die Zahl 1...

Gruß Garfield
-
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Re: Lassen sich Integer-Zahlen bitweise auslesen?
Abend Leute,
die oben von mse beschriebene Methode klappt hervorragend mit Variablen vom Typ dword (32bit). Mit qword-Variablen scheint sie aber nicht mehr zu funktionieren...
Kennt vielleicht jemand eine Modifikation, um obige extrem schnelle Methode auch für qword (und damit 64 bit) verwenden zu können?
Viele Grüße, Alexander
die oben von mse beschriebene Methode klappt hervorragend mit Variablen vom Typ dword (32bit). Mit qword-Variablen scheint sie aber nicht mehr zu funktionieren...
Kennt vielleicht jemand eine Modifikation, um obige extrem schnelle Methode auch für qword (und damit 64 bit) verwenden zu können?
Viele Grüße, Alexander
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Lassen sich Integer-Zahlen bitweise auslesen?
Kannst du dazu etwas genaueres sagen? Was funktioniert nicht? Die shift-Operation? Die and-Operation? Die Tabellenadressierung? Die Tabelle in msebits.pas (diese hat lediglich 32 bit Werte)?Euklid hat geschrieben:Mit qword-Variablen scheint sie aber nicht mehr zu funktionieren...
-
- Beiträge: 36
- Registriert: So 17. Aug 2008, 00:04
Re: Lassen sich Integer-Zahlen bitweise auslesen?
Der Euklid und ich programmieren an einem (echten) Vektor-basierten Grafik-Anti-Aliasing, welches multi-threaded an einem Funktionsgraphen rechnen kann. Die Bit-Operationen müssen wir verwenden um so Subpixel zu komprimieren und somit die Anzahl Speicherzugriffe auf dem RAM möglichst gering zu halten, da sonst Multi-Threading mehr oder weniger nicht wie erwünscht funktioniert. Mit Dword lässt sich maximal 32-faches Anti-Aliasing wirklich schnell (Rechenzeit) und komfortabel umsetzen...und funktioniert auch (Danke nochmal für eure Vorschläge). Möchte man 64-faches AA, so bräuchte man Qword, weil man hiermit 64bit hin und her schalten kann. Nun verhält es sich so, dass mit steigender AA-Stufe ab 33x-AA der Graph immer heller wird, also werden entsprechende bits nicht gesetzt oder aber falsch ausgelesen. (War bisher zu faul und beruflich zu beschäftigt um herauszufinden, an welcher der beiden Funktionen es liegt oder ob an beiden) Diese Funktionen sind hierbei ausschlaggebend:mse hat geschrieben:Kannst du dazu etwas genaueres sagen? Was funktioniert nicht? Die shift-Operation? Die and-Operation? Die Tabellenadressierung? Die Tabelle in msebits.pas (diese hat lediglich 32 bit Werte)?Euklid hat geschrieben:Mit qword-Variablen scheint sie aber nicht mehr zu funktionieren...
Code: Alles auswählen
function tGraphCom.GetBit(const Value: QWord; const Bit: Byte): Boolean;
begin
Result := (Value and (1 shl Bit)) <> 0;
end;
function tGraphCom.SetBit(const Value: QWord; const Bit: Byte): QWord;
begin
Result := Value or (1 shl Bit);
end;
Zuletzt geändert von monta am Sa 4. Jul 2009, 12:13, insgesamt 1-mal geändert.
Grund: Highlighter gesetzt.
Grund: Highlighter gesetzt.
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Lassen sich Integer-Zahlen bitweise auslesen?
bei "(1 shl Bit)" weiß der Compiler nicht, dass Du ein QWord als ergebnis haben möchtest, rechnet also mit Integer.CPU-Quaeler hat geschrieben: function tGraphCom.GetBit(const Value: QWord; const Bit: Byte): Boolean;
begin
Result := (Value and (1 shl Bit)) <> 0;
end;
Versuch 'mal statt dessen (QWord(1) shl Bit) !
-Michael
-
- Beiträge: 36
- Registriert: So 17. Aug 2008, 00:04
Re: Lassen sich Integer-Zahlen bitweise auslesen?
@ mschnell: Da ist wohl was dran...danke für den Hinweis, es funktioniert nun
Das ganze ist nun mit 32x AA bei einer Benchmark-Funktion ca. 12% langsamer, aber das ist auch logisch.
