Autor Beitrag
IhopeonlyReader
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 20.08.13 21:06 
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" ?

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
Mr_Emre_D
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 114
Erhaltene Danke: 14



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  a: ByteBool;

begin
  a := ByteBool(2); // true
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 20.08.13 21:32 
user profile iconMr_Emre_D hat folgendes geschrieben Zum zitierten Posting springen:
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:
user profile iconIhopeonlyReader 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 ;)

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: 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..

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var b: Boolean;
begin
b := True; 
if boolean( not Byte(b) ) then showmessage('t'); //wird ausgegeben
if boolean( not b ) then showmessage('t2'); //wird nicht ausgegeben
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:
ausblenden 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
//P1 und P2 irgendein objekt zuweisen
P2 := P1;
//P2 von vorher ist nun "verloren" im speicher
DasObjekt( P2 ).Wert := neuerWert;
//plötzlich ist P1.Wert auch verstelllt worden

//bei Strings, die immer als Pointer angesehen werden:
S1 := 'beispielstring';
S2 := 'irgendwasanderes';
S2 := S1;
//nichts liegt verloren im speicher
S2 := 'malwasanderes';
//S1 ist weiterhin 'beispielstring'
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)

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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
ausblenden 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

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.

Für diesen Beitrag haben gedankt: Martok, Oliver Marx