Autor Beitrag
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Do 28.02.08 09:29 
Hallo.

Ich habe die Aufgabe ein Binärprotokoll umzusetzen. Die Spezifikation verlangt folgendes:
Zitat:
The flags field contains a signed 3-bit value (-2 to 2) and a sticky flag in the lowest (rightmost) nibble.

Das ganze Feld ist 2 byte lang und ich habe es als Word deklariert.
Meine Frage ist: Wie macht man das in Delphi. Ich habe von Bit-Arithmetik gar keine Ahnung :(

In einem PHP Beispiel wurde das so gelöst:
ausblenden Quelltext
1:
2:
3:
      $flags = ($priority & 7) * 2;
      if($priority < 0) $flags |= 8;
      if($sticky) $flags |= 1;

Die Priorität kann die Werte -2, -1, 0, 1, 2 haben und der Wert Sticky ist ein boolscher Wert.

Danke schon mal im Voraus !
Matze

_________________
In the beginning was the word.
And the word was content-type: text/plain.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 28.02.08 10:01 
& ist and und | ist or in Delphi. Ansonsten sieht das identisch aus ;-):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  flags := (priority and 7) * 2;
  if priority < 0 then
    flags := flags or 8;
  if sticky then
    flags := flags or 1;
Um ein einzelnes Bit zu setzen kannst du folgendes machen:
ausblenden Delphi-Quelltext
1:
2:
3:
  intvalue := 0;
  bitnumber := 3;
  intvalue := intvalue or (1 shl bitnumber);
Dabei ist bitnumber nullbasiert. Im Beispiel kommt also binär 1000 heraus, denn shl verschiebt alle Bits (es ist ja nur das erste gesetzt bei der 1) um die angegebene Anzahl Bits nach links und durch das and wird das Bit im Ergebnis gesetzt.
Zum Testen ob ein Bit gesetzt ist:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  intvalue := 8;
  bitnumber := 3;
  if intvalue and (1 shl bitnumber) > 0 then
    ShowMessage('Ist gesetzt');


Ich nehme mal an die Bitoperationen and und or an sich sind dir klar, aber da du meintest, du hast von Bit-Arithmetik gar keine Ahnung: Mit and werden im Ergebnis alle Bits gesetzt, die in einem der Operanden gesetzt sind und mit or alle, die in einem der Operanden gesetzt sind:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
    1010
and 1001
 =  1000
// EDIT:
Ja, da habe ich mich verschrieben... jetzt ist es richtig

   1010
or 1001
 = 1011


Und das ganze nochmal verpackt in Funktionen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  function SetBit(uNumber, uBit: Integer): Integer;
  // uBit ist nullbasiert!
  begin
    Result := uNumber or (1 shl uBit);
  end;

  function IsBitSet(uNumber, uBit: Integer): Boolean;
  // uBit ist nullbasiert!
  begin
    Result := uNumber and (1 shl uBit) > 0;
  end;


Zuletzt bearbeitet von jaenicke am Do 28.02.08 21:46, insgesamt 1-mal bearbeitet
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1340
Erhaltene Danke: 120

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Do 28.02.08 13:29 
user profile iconjaenicke hat folgendes geschrieben:

Ich nehme mal an die Bitoperationen and und or an sich sind dir klar, aber da du meintest, du hast von Bit-Arithmetik gar keine Ahnung: Mit and werden im Ergebnis alle Bits gesetzt, die in einem der Operanden gesetzt sind und mit or alle, die in einem der Operanden gesetzt sind:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
    
    1010
and 1001
 =  1011

   1010
or 1001
 = 1011



Hast du dich da nicht verschrieben?
and spuck, zumindest mit meinem Rechner und meinem Kopf-Rechner was anders aus:
ausblenden Quelltext
1:
2:
3:
4:
    
    1010
and 1001
 =  1000

Denn and besagt doch das im Ergebnis immer an der Stell ein Bit gesetzt ist, wo in beiden Eingabewerten die betreffende Stelle auch gesetzt (1) ist. Ansonsten kommt immer Null.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
matze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Do 28.02.08 14:31 
Vielen Dank an alle !!

Ihr habt mir sehr geholfen !

_________________
In the beginning was the word.
And the word was content-type: text/plain.