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
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#1

Bitoperationen

  Alt 21. Feb 2011, 19:41
Hallo Delphi-PRAXIS,

diesmal sind die "Lehrer" unter euch gefragt.
Ich bin sehr unerfahren mit Bitoperationen, möchte es aber unbedingt lernen/benutzen. Für einige von euch ist es bestimmt das einfachste von der Welt, also bitte korrigiert mich und schreit wenn ich völlig falsch liege.
Ich habe:
Code:
Attribut : byte;
Das möchte ich in 3 Bits unterteilen, also sodass ich Attribut1 (0,0,0), Attribut2 (0,0,1), Attribut3 (0,1,0) usw. Ich brauche so 7-8 verschiedene Möglichkeiten. Wie lege ich das so an?

Aber jetzt hatte ich irgendwann was gelesene, dass man daraus $00 macht und damit arbeitet... Wie funktioniert das nun wieder?
Was bringt es shift left (shl) und shift left (shr) zu benutzen... Geht es hierbei wieder nur um Ressourcensparen?

Seid geduldig mit mir

FG Dunkelbunt

Geändert von Dunkelbunt27 (21. Feb 2011 um 19:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.167 Beiträge
 
Delphi 12 Athens
 
#2

AW: Bitoperationen

  Alt 21. Feb 2011, 19:59
Hexadezimalzahlen (dein $xx) wie man Dezimal in Hexadezimal umwandelt, kannst du bestimmt überall erfahren.

$00, $01, $02 ... $07
oder eben doch einfach dezimal 0 bis 7 nutzen

Statt deinem Byte und bei dieser Bitfolge (falls ich sie richtig erkannt hab) kannst du auch Folgendes nehmen:
TMyType = (Attribut1, Attribut2, Attribut3, ... , Attribut8); .

PS: Bei 3 Bit und 8 Möglichkeiten kommt man mit Binäroperationen eh nicht so gut voran.
Hier ist ein Cast besser ... siehe den ENUM vom Anfang oder eben ganz einfach die Zahlen von 0 bis 7.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#3

AW: Bitoperationen

  Alt 21. Feb 2011, 20:04
Danke erstmal,....
wie lege ich überhaupt fest aus wievielen Bit meine Zahl besteht?
Momentmanl... wenn ich Byte nehme ebsteht es ja automatsich aus 8 bit..... denkfehler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.167 Beiträge
 
Delphi 12 Athens
 
#4

AW: Bitoperationen

  Alt 21. Feb 2011, 20:12
es kommt darauf an, wie du deine Werte kodieren möchstest.

Du kannst die Werte z.B. im Zweierkomplement minimal kodieren (also kleinstmögliche Bitanzahl).
Oder binär jeden Wert in einem einzelnem Bit.
Oder sonstwie.

Wenn du jeden wert in einem Bit kodierst, dann machen sich Bitvergleiche natürlich einfacher und man kann sogar alle Werte zusammen in einer Variable unterbekommen (SET).


Es kommt also erstmal darauf an, was genau du vor hast.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#5

AW: Bitoperationen

  Alt 21. Feb 2011, 20:36
Hallo,

perfekt wäre alle Werte in einer Variable zu kodieren. Dann könnte ich mir die 8 Bit aufteilen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.167 Beiträge
 
Delphi 12 Athens
 
#6

AW: Bitoperationen

  Alt 21. Feb 2011, 21:00
Eine Variable ist in Delphi immer ganze 1, 2, 4 oder 8 Byte groß.
Oder eben eine Mischung daraus (Records/Objekte).

Wie gesagt, es gibt mehrere Varianten 8 Werte in einer Variable zu speichern .... es kommt allerdings darauf an was man damit erreichen will ... jenachdem eignet sich die einer oder andere Variante mehr dafür.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
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
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#8

AW: Bitoperationen

  Alt 22. Feb 2011, 16:01
Danke, super.
Damit kann ich was anfangen

EDIT:
Wegen der Vollständigkeit:
Delphi-Quellcode:
function IntToBin(Int: Integer): String;
var
  i : Integer;
begin
  Result := '';
  for i := 7 downto 0 do
  Result := Result + IntToStr((Int shr i) and 1);
end;

function BinToInt(Binary: String): Integer;
var
  i : Integer;
begin
  Result := 0;
  for i := Length(Binary) downto 1 do
  Inc(Result, StrToInt(Binary[i]) * 1 shl (Length(Binary) - i));
end;
EDIT2:
Bin etwas verwirrt... wollte eigentlich nur Schruftfarben mit Bits kodieren....

FG Dunkelbunt

Geändert von Dunkelbunt27 (22. Feb 2011 um 17:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#9

AW: Bitoperationen

  Alt 23. Feb 2011, 16:20
Wer das Problem mit mir teilt:
http://www.delphipraxis.net/95180-ef...bitmasken.html
ein gutes Tutorial von DeddyH, danke an dieser Stelle.

FG Dunkelbunt
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Bitoperationen

  Alt 23. Feb 2011, 17:18
Danke für die Blumen
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 20:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz