Lassen sich Integer-Zahlen bitweise auslesen?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Euklid
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?

Beitrag von Euklid »

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

mse
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?

Beitrag von mse »

Code: Alles auswählen

result:= z and (1 shl 3 ) <> 0;
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 bits[bitnummer] <> 0;
oder

Code: Alles auswählen

result:= checkbit(z,bitnummer);

Euklid
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?

Beitrag von Euklid »

mse hat geschrieben:

Code: Alles auswählen

result:= z and (1 shl 3 ) <> 0;
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 bits[bitnummer] <> 0;
oder

Code: Alles auswählen

result:= checkbit(z,bitnummer);
Vielen Dank, mse! Hast uns einen großen Schritt weitergeholfen... :)

mse
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?

Beitrag von mse »

Hmm, für dein konkretes Beispiel wohl eher

Code: Alles auswählen

result:= z and (1 shl (3-1) ) <> 0;

Euklid
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?

Beitrag von Euklid »

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

Benutzeravatar
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?

Beitrag von Garfield »

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

Hitman
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?

Beitrag von Hitman »

Ö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).

Benutzeravatar
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?

Beitrag von Garfield »

Hitman hat geschrieben:Shiftest du "1" um 2 nach links, hast du das dritte Bit auf "1", alle anderen "0".
:? Wenn das Bit 2 um 2 nach links geshiftet wird, ist es nicht Bit 0 sondern Bit 4!?
Gruß Garfield

Hitman
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?

Beitrag von Hitman »

Öh ja. Aber die shiften die Zahl 1 - also 00000001b - um zwei nach links. Und das ist 00000100b. Also das dritte Bit.

Benutzeravatar
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?

Beitrag von Garfield »

Hitman hat geschrieben:Öh ja. Aber die shiften die Zahl 1...
Au. :oops: Ich shifte immer die Zahl selbst. Das war jetzt Selbstüberlistung.
Gruß Garfield

Euklid
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?

Beitrag von Euklid »

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

mse
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?

Beitrag von mse »

Euklid hat geschrieben:Mit qword-Variablen scheint sie aber nicht mehr zu funktionieren...
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)?

CPU-Quaeler
Beiträge: 36
Registriert: So 17. Aug 2008, 00:04

Re: Lassen sich Integer-Zahlen bitweise auslesen?

Beitrag von CPU-Quaeler »

mse hat geschrieben:
Euklid hat geschrieben:Mit qword-Variablen scheint sie aber nicht mehr zu funktionieren...
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)?
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:

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;
Ich habe mich mit Bit-Operationen vorher nie so beschäftigt. Gibt es da vielleicht eine Lösung, damit das ganze auch mit Qword funktioniert ohne den Quellcode explodieren zu lassen?
Zuletzt geändert von monta am Sa 4. Jul 2009, 12:13, insgesamt 1-mal geändert.
Grund: Highlighter gesetzt.

mschnell
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?

Beitrag von mschnell »

CPU-Quaeler hat geschrieben: function tGraphCom.GetBit(const Value: QWord; const Bit: Byte): Boolean;
begin
Result := (Value and (1 shl Bit)) <> 0;
end;
bei "(1 shl Bit)" weiß der Compiler nicht, dass Du ein QWord als ergebnis haben möchtest, rechnet also mit Integer.

Versuch 'mal statt dessen (QWord(1) shl Bit) !

-Michael

CPU-Quaeler
Beiträge: 36
Registriert: So 17. Aug 2008, 00:04

Re: Lassen sich Integer-Zahlen bitweise auslesen?

Beitrag von CPU-Quaeler »

@ mschnell: Da ist wohl was dran...danke für den Hinweis, es funktioniert nun :-D Das ganze ist nun mit 32x AA bei einer Benchmark-Funktion ca. 12% langsamer, aber das ist auch logisch.

Antworten