AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bitoperationen

Ein Thema von Dunkelbunt27 · begonnen am 21. Feb 2011 · letzter Beitrag vom 26. Feb 2011
 
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Bitoperationen

  Alt 21. Feb 2011, 23:46
(...) sodass ich Attribut1 (0,0,0), Attribut2 (0,0,1), Attribut3 (0,1,0) usw. Ich brauche so 7-8 verschiedene Möglichkeiten (...)
Ich weiß zwar nicht, was du mit Möglichkeiten meinst, aber ein Byte hat nur einen "Umfang" von 8 Stellen > 00000000 - 8 Stellen wobei jede Stelle 2 Zustände annehmen kann -> 1 oder 0.
Das ergibt letzendlich 2^8 (= 256) Möglichkeiten, was wiederum einem Byte entspricht.

So, zu den einzelnen Bitoperationen:
OR
Per Or kannst du Bits verknüpfen, wobei gilt: mindestens ein Zustand von 2 muss 1 sein, damit letzendlich der Gesamtzustand 1 ist:
0 or 0 = 0
1 or 0 = 1
0 or 1 = 1
1 or 1 = 1

AND
Per And verknüpfst du wie folgt: es müssen beide Zustände 1 sein, damit der Gesamtzustand 1 ist:
0 and 0 = 0
1 and 0 = 0
0 and 1 = 0
1 and 1 = 1

XOR
Auch exklusives Or: es muss nur einer der beiden Zustände 1 sein:
0 xor 0 = 0
1 xor 0 = 1
0 xor 1 = 1
1 xor 1 = 0

SHL
Shift Left: verschiebt die Bits Y nach links um X Bits: Y shl X
10101101 shl 1 = 01011010
01 shl 2 = 100

SHR
Shift Right: verschiebt nach rechts:
10 shr 1 = 01
01 shr 1 = 00

Dann gibts noch ROL und ROR. Diese "Rollen" die Werte nach L oder R. Rollen im Sinne von - was hinten ist und normalerweise abgeschnitten wird, kommt an den Anfang:
1100 rol 1 = 1001
1001 rol 1 = 0011

Sofern du das verstanden hast, gehts hier weiter:
Sagen wir, du willst von einem Byte die Least Significant Bits beibehalten und die restlichen ignorieren/wegbringen
(kurz angemerkt: die 4 Least Significant Bits sind 0000XXXX die mit X gekennzeichnet).
Dann gehst du wie folgt vor:
0000XXXX and
00001111
--------
////XXXX
ganz egal, was in X steht, der Wert bleibt erhalten und die restlichen Werte gehen verloren. Auch wenn da statt 0 etwas andere drin stehen würde.

Nun musst du nur noch mehr wissen, wie man den dezimalen Wert binär darstellt. Dazu einfach mal googlen oder so.

Ein praktisches Beispiel:
Delphi-Quellcode:

type
  TBitRange = 0..7;
  TBitState = Boolean;
  TBitByte = record
  private
    FValue: Byte;
    function GetBits(BitIndex: TBitRange): TBitState;
    procedure SetBits(BitIndex: TBitRange; const Value: TBitState);
    procedure SetValue(const Value: Byte);
  public
    property Value: Byte read FValue write SetValue;
    property Bits[BitIndex: TBitRange]: TBitState read GetBits write SetBits; default;
    function AsString(): String;
  end;


const
  BitChar : Array[TBitState] of Char = ( '0', '1' );
  BitTable : Array[TBitRange] of Byte = ( 1, 2, 4, 8, 16, 32, 64, 128 );

{ TBitByte }

function TBitByte.AsString: String;
var
  i: TBitRange;
begin
  SetLength( Result, 8 );
  for i := 0 to 7 do
    Result[8-i] := BitChar[Bits[i]];
end;

function TBitByte.GetBits(BitIndex: TBitRange): TBitState;
begin
  Result := FValue and BitTable[BitIndex] > 0;
end;

procedure TBitByte.SetBits(BitIndex: TBitRange; const Value: TBitState);
begin
  FValue := FValue or BitTable[BitIndex];
end;

procedure TBitByte.SetValue(const Value: Byte);
begin
  FValue := Value;
end;
Demo
Delphi-Quellcode:
var
  i: TBitRange;
  B: TBitByte;

begin
  for i := 0 to 3 do
    B[i] := True;
  Writeln( B.Value, ' - ', B.AsString );
  Readln;
end.
ergibt "15 - 00001111"
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz