Entwickler-Ecke
Dateizugriff - Byte aus Bits zusammensetzen
rizla - Do 09.12.10 18:21
Titel: Byte aus Bits zusammensetzen
Hi,
irgendwie steht ich gerade auf dem Schlauch :x
Wie setze ich aus [x] bits ein Byte zusammen? (Maximal 8 Bit - sonst wäre es ja mehr als ein Byte :D)
Ich habe z.B. 5 Bytes, daraus nehm ich jeweils das erste Bit (lsb) und diese will ich zu einem Byte "b" zusammenfassen:
Beispiel:
Byte 1 = (00000011)
Byte 2 = (00000001)
Byte 3 = (00000000)
Byte 4 = (00000001)
Byte 5 = (00000000)
b = 11010 (resp. 00011010)
Habe gedacht, ich setze jeweils das erste Bit auf 0 oder 1 und shifte dann eine Stelle nach links , aber das funktioniert nicht..
Hilfe!
Danke im Vorraus.
rizla
Flamefire - Do 09.12.10 18:25
Ich bin dafür jeden zu steinigen, der "geht nicht" schreibt. :twisted:
Also: Was geht nicht? Welchen Code hast du?
rizla - Do 09.12.10 18:41
Globale Variable PalIdx: byte;
Funktion, um ein Bit zu lesen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function TForm1.GetBit: byte; begin result := 0; if CurrBit = 8 then begin CurrBit := 0; inc(CurrOffset); end; if (Buffer[CurrOffset] AND (1 shl CurrBit) <> 0) then result := 1; inc(CurrBit); end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure SetBit; begin PalIdx := (PalIdx AND 1); end;
procedure ClrBit; begin PalIdx := (PalIdx or 1); end; |
Etwas tiefer im Code
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| PalIdx := 0;
for i := 1 to 7 do begin if GetBit = 1 then SetBit else ClrBit; b := b shl 1; end; |
Ich hoffe, der Code ist verständlich..
:r:
PS: das mit dem steinigen passiert wahrscheinlich auch in irgendwelchen nah-/fernöstlichen Foren ;)
Flamefire - Do 09.12.10 18:44
Ok... dann guck dir mal genau an, was and und or macht:
00110101 AND
00000001 =
00000001
Ist das das, was du wolltest?
Außerdem hantierst du mit vielen globalen variablen rum --> Nicht gut.
Und letztendlich: Du setzt palIDX aber shiftest b (was auch immer b ist)
F34r0fTh3D4rk - Do 09.12.10 18:48
ungetestet:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var bytes: array of byte; i: integer; r: byte; begin r := 0; for i := 0 to high(bytes) do r := r or (bytes[i] shl i); result := r; end; |
und wenn man ganz auf Nummer sicher gehen will:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var bytes: array of byte; i: integer; r: byte; begin r := 0; for i := 0 to high(bytes) do r := r or ((bytes[i] shl i) and (1 shl i)); result := r; end; |
btw:
SetBit muss
(or 1) und
ClearBit (and 0) sein.
rizla - Do 09.12.10 19:29
@FlameFire:
ich meinte natürlich PalIdx := (PalIdx shl 1).
Danke jedenfalls. Wird schon funktionieren ;)
:r:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!