![]() |
Delphi-Version: 5
Problem mit Bit-Manipulation
Hallo Forum,
Ich bin gerade dabei ein Übungsprogramm zu schreiben um die Manipulation von Zahlen mit Hilfe der Bit-Befehle (OR, AND, XOR etc.) in Delphi umzusetzen und zu verstehen. Soweit klappen auch alle Befehle, nur beim NOT Befehl hab ich meine Schwierigkeiten. (Habe 2 Edit eingabefelder - EdtEingabe, EdtEingabe2 - und für jede Bit Operation einen Button) Hier mein Quelltext:
Delphi-Quellcode:
Hoffe es ist nicht ein allzu dummer fehler :-D
procedure TForm1.BtnClick(Sender: TObject);
var Ergebnis: Integer; hilfswert: Integer; begin Eingabe := StrToInt(EdtEingabe.Text); Eingabe2 := StrToInt(EdtEingabe2.Text); if Sender = BtnNot then begin Ergebnis := NOT Eingabe; //????? LblErgebnis.Caption := IntToStr(Ergebnis); end; if Sender = BtnAnd then begin Ergebnis := eingabe AND eingabe2; LblErgebnis.Caption := IntToStr(Ergebnis); end; if Sender = BtnOR then begin Ergebnis := Eingabe OR Eingabe2; LblErgebnis.Caption := IntToStr(Ergebnis); end; if Sender = BtnXOR then begin Ergebnis := Eingabe XOR Eingabe2; LblErgebnis.Caption := IntToStr(Ergebnis); end; if Sender = BtnShl then begin hilfswert := StrToInt(InputBox('SHL', 'Geben sie einen Wert für die SHL Funktion ein', '2')); Ergebnis := Eingabe SHL hilfswert; LblErgebnis.Caption := IntToStr(Ergebnis); EdtEingabe2.Text := '0'; end; if Sender = BtnShr then begin hilfswert := StrToInt(InputBox('SHR', 'Geben sie einen Wert für die SHR Funktion ein', '2')); Ergebnis := Eingabe SHR hilfswert; LblErgebnis.Caption := IntToStr(Ergebnis); EdtEingabe2.Text := '0'; end; end; |
AW: Problem mit Bit-Manipulation
Und was soll da jetzt falsch sein?
|
AW: Problem mit Bit-Manipulation
Bei dem NOT befehl gibt er mir die Eingabe um 1 erhöht nur negativ aus
Quasi Eignabe: 4 Ausgabe: -5 |
AW: Problem mit Bit-Manipulation
Und was hast Du erwartet? Bekommst Du das gewünschte Ergebnis, wenn Du nicht integer, sondern Cardinal nimmst?
|
AW: Problem mit Bit-Manipulation
Cardinal bewirkt das gleiche Ergebnis...
Aber wenn ich das richtig verstanden habe, dann müsste bei 4 (also 0100), 11 (1011) herauskommen oder? |
AW: Problem mit Bit-Manipulation
Und was ist mit den restlichen 28 Bit?
[edit] Nochmal zum Verständnis:
Code:
[/edit]
//integer = 32 Bit
00000000000000000000000000000100 // = 4 11111111111111111111111111111011 // = not 4 |
AW: Problem mit Bit-Manipulation
hm... dann wäre die 4 ja 0000 0000 0000 0000 0000 0000 0000 0100 und bei NOT würde dann 1111 1111 1111 1111 1111 1111 1111 1011 herausbekommen... das wäre dann ja doch ein bisschen größer als erwartet
|
AW: Problem mit Bit-Manipulation
das wäre 16 777 211
|
AW: Problem mit Bit-Manipulation
Sicher?
[edit] Du musst Dich schon auf den gewünschten Zahlenbereich einschränken, indem Du entweder einen anderen Datentyp nimmst oder mit einer Konstanten ver"and"est. [/edit] |
AW: Problem mit Bit-Manipulation
2^31 = 2 147 483 648 :oops: okay
|
AW: Problem mit Bit-Manipulation
Und genau das ist richtig.
das höste Bit ist quasi das "-" und damit die 0 nicht doppelt vorkommt, gibt es kein "-0", weswegen dann natürlich die negativen Darstellungen um 1 verschoben sind. > ![]() Laß dir das Ergebnis und den Eingang doch einfach mal Hexadezimal oder Binär ausgeben. |
AW: Problem mit Bit-Manipulation
okay... wenn ich die NOT Funktion anwende und das Ergebnis in Binär ausgebe stimmts schonmal
|
AW: Problem mit Bit-Manipulation
Es hätte mich auch gewundert, wenn nicht. Wie gesagt, Du kannst zur Not noch AND-verknüpfen, wenn Du Dich auf eine bestimmte Bitbreite einschränken willst.
|
AW: Problem mit Bit-Manipulation
Danke schonmal für die Antworten :thumb: Dann probiere ich das mit dem AND jetzt mal noch aus
|
AW: Problem mit Bit-Manipulation
Delphi-Quellcode:
Könnte man das auch verwenden? :lol:
(not zahl1) and (not 2147483648);
|
AW: Problem mit Bit-Manipulation
Zitat:
Delphi-Quellcode:
:zwinker:
ShowMessage(IntToStr(not 4 and $0000000F));
|
AW: Problem mit Bit-Manipulation
Verwende auch mal Cardinal (LongWord) statt dem Integer (LongInt).
Dazu dann noch IntToStr und ![]() Bedenke, daß es 2147483648 im "Integer" nicht gibt. Es funktioniert nur, da dieses zufällig (falls überhaupt) in einen Int64 umgewandelt wird. Der Compiler verwendet selten Cardinal und versucht es öfters gegen Integer/Int64 zu casten. Wärend $80000000 in einen Integer paßt, da bei der Hexadezimaldarstellung vom Compiler standardmäßig kein "-" erwartet wird und es somit in 32 Bit reinpaßt. |
AW: Problem mit Bit-Manipulation
:-Dcool, danke für die :thumb: so läufts endlich :-D
Das mit dem Cardinal werd ich mir mal genauer angucken :-D |
AW: Problem mit Bit-Manipulation
Der Unterschied zwischen Integer und Cardinal ist einfach der, dass Integer vorzeichenbehaftet ist, d.h. das höchstwertige Bit bestimmt, ob es sich um eine positive oder negative Zahl handelt.
|
AW: Problem mit Bit-Manipulation
ah okay... und bei Cardinal würde die Zahl dann positiv bleiben
|
AW: Problem mit Bit-Manipulation
Exakt. Schau doch einfach mal in die Hilfe zu den verschiedenen ganzzahligen Datentypen, da stehen alle Informationen, die Du brauchst.
|
AW: Problem mit Bit-Manipulation
mach ich! danke :-D
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:00 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