Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - [Delphi] Frage zu not
IhopeonlyReader - Di 20.08.13 21:06
Titel: [Delphi] Frage zu not
Guten Tag,
bis jetzt habe ich not auf 2 verschiedene weisen verwendet
- um Booleans zu vertauschen (true->false und andersrum)
- als Bitoperator
und habe mir bei der Verwendung wenig Gedanken gemacht..
Heute ist mir nur aufgefallen, da ich zur zeit mit beiden gleichzeitig arbeite, zerbrach ich mir den Kopf ob meine Vorstellung vom NOT und was es macht falsch sei.. Es funktioniert so wie ich es mir vorstelle in den Bereichen richtig, aber dennoch hat not doch nicht 2 befehle "in sich" oder?
Meine Vorstellung vom Bitoperator - Not:
aus 0 wird 1 und aus 1 wird 0:
Beispiel: 13 (0000 1101)
wird zu: 242 (1111 0010)
Meine Vorstellung vom Boolean- Not:
True (1) wird zu False(0)
Ebenfalls habe ich Boolean( ByteWert ) einfach so verwendet.. hier wurde jedesmal wenn eine 1 vorkam (Zahl<>0) True sonst (ByteWert=0) ein False...
Meine Frage:
Aber da Booleans ja keine Bits sondern Bytes sind, müsste man ein Boolean ja nicht als 1 sondern als 0000 0001 betrachten
somit müsste
not True
ja eigentlich nicht 0 sondern 1111 1110 liefern, und das wäre <>0 und somit True !
was ist falsch ein meiner "Denkweise" ?
Mr_Emre_D - Di 20.08.13 21:23
Es gibt zwei Arten von ~Operatoren:
Logische- und Bitoperatoren.
Das, was du da schilderst, basiert auf Bits.
Ich glaube, dass Delphi da genau kuckt, um was für eine Art von Argument es sich handelt und wählt dann dementsprechend.
Edit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var a: ByteBool;
begin a := ByteBool(2); if a then writeln('a is true'); a := not a; if a then writeln('a is still true');
readln; end; |
Ausgabe:
"a is true"
Aus 2 (0000 0010) wird ein not 2 (111 1101) gemacht,
was im Grunde immernoch nicht 0 (false) ist. Sprich a sollte durchgehend true sein.
Trotzdem kommt es zur zweiten Meldung nicht.
Folglich macht Delphi mit dem Operator "not" bei Booleans ein logisches Not. (Aus 0 wird 1, aus nicht 0 wird 0)
IhopeonlyReader - Di 20.08.13 21:32
Mr_Emre_D hat folgendes geschrieben : |
Es gibt zwei Arten von ~Operatoren:
Logische- und Bitoperatoren.
Folglich macht Delphi mit dem Operator "not" bei Booleans ein logisches Not. (Aus 0 wird 1, aus nicht 0 wird 0) |
Zu dem was in klammern steht, ergänze ich
Wenn eine 1 vorkommt dann alle 1 durch 0 ersetzten, 0 bleibt 0
sonst aus 0 1 machen (0000 0000 -> 0000 0001)
also stimmt meine Vermutung/ Erklärung/ Vorschlag oder doch eher Frage, wie auch immer:
IhopeonlyReader hat folgendes geschrieben: |
aber dennoch hat not doch nicht 2 befehle "in sich" oder? |
Edit: Achso mit dem in klammern meintest du nicht bits sondern Zahlen/ Werte :D ok dann stimmts natürlich ;)
IhopeonlyReader - Di 20.08.13 22:29
Ich persönlich gehe aber weniger davon aus, dass es sozusagen eine überladene Version von NOT gibt...
sicherlich ist wird beim Boolean selbst irgendwas gemacht (z.B. wenn boolean_alt + boolean_neu = 255 dann boolean := 0;)
denn alles andere denke ich führt zu Verwirrung..
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var b: Boolean; begin b := True; if boolean( not Byte(b) ) then showmessage('t'); if boolean( not b ) then showmessage('t2'); end; |
da not Byte anders gehandelt wird als not boolean ist sicher: boolean ist intern nicht direkt ein Byte !
Wie gesagt
not; overload;
kann ich mir nicht wirklich vorstellen...
dasselbe mit strings:
strings sind eigentlich pointer, aber kopieren von strings klappt trotzdem ohne Probleme:
Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| var P1, P1: Pointer; S1, S2: String; begin P2 := P1; DasObjekt( P2 ).Wert := neuerWert;
S1 := 'beispielstring'; S2 := 'irgendwasanderes'; S2 := S1; S2 := 'malwasanderes'; end; |
bei Bytes/booleans kann man casten und somit das "andere" nutzen.. kann man das bei strings/Objekten auch?
wenn man Objekte "kopieren" will einfach in strings casten, kopieren, wieder zurück casten fertig?
oder verstehe ich Strings falsch? Booleans falsch und ich denke vieles weiter auch :D
Wie muss ich Strings ansehen wenn nicht als Pointer und nicht als Array of Char?
wie muss ich Booleans ansehen wenn nicht als Byte?
(ansehen = gleichsetzten, um sie zu verstehen)
Mathematiker - Di 20.08.13 22:49
Hallo,
irgendwie verstehe ich Dein Problem nicht. :nixweiss:
Oder besser, ich wundere mich, worüber Du Dir Gedanken machst.
Not ist der
Bezeichner eines Operators, der vom Compiler entsprechend des Operanden interpretiert wird. Das Gleiche hast Du auch bei AND, OR, XOR und selbst bei der Addition von Zahlen oder z.B. auch Strings. Dort gehst Du doch auch nicht davon aus, das die einzelnen Zeichen des Strings nach ihrem Index addiert werden. Was das auch wäre.
Der "Schöpfer" vom Original-Pascal hätte das Not für logische Operanden z.B. auch "Apfelsine" und für Bytes "Tomate" nennen können.
Dann würdest Du Dir über
Delphi-Quelltext
1: 2:
| apfelsine booleanvariable tomate bytevariable |
doch auch keine Gedanken machen.
Es ist der gleiche Bezeichner für zwei ähnliche, aber trotzdem verschiedene Operatoren. In anderen Sprachen ist es unterschiedlich, z.B.
Zitat: |
Logical negation (NOT) !a
Bitwise NOT ~a |
Beste Grüße
Mathematiker
Tranx - Mi 21.08.13 04:37
In Delphi ist - wenn ich die Hilfe richtig verstehe - NOT der gleiche Operatorbezeichner für sowohl bitweises als auch logisches NOT. Und hier unterscheidet Delphi je nach Operandortyp.
Ist der Operandortyp boolean, wird das logische NOT angewandt, bei integer das bitweise.
Das Gleiche gilt im übrigen für and, or, xor genauso. Liegt bei diesen Operatoren ein boolean als Operandor vor, wird logisch vorgegangen und das Ergebnis ist ein boolscher Wert, andernfalls bitweise und das Ergebnis ist ein Integerwert.
In dem Sinne verhält es sich wie überladene Funktionen.
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!