Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi bool'sches Verständigungsproblem (https://www.delphipraxis.net/101290-boolsches-verstaendigungsproblem.html)

programmierer 10. Okt 2007 20:20


bool'sches Verständigungsproblem
 
Guten Abend!

Ich sitze gerade an einem Spiel und habe ein Problem, wenn man es so nennen will.
Es funktioniert zwar bis jetzt alles einwandfrei, aber ich verstehe nicht warum ^^

Folgendes:

Delphi-Quellcode:
if (sel <> (117 AND -1) then
  if ( (i AND j) in [0..7] ) then
   [...]
Wenn angenommen (sel = -1) ist, dann ergibt die erste Abfrage true. (sollte false sein)
Wenn i oder j z.B. 10 ist, dann ergibt auch die zweite Abfrage true. (sollte ebenfalls false sein)
Das verstehe ich nicht so ganz, denn wenn ich schreibe

Delphi-Quellcode:
if (sel <> (117 OR -1) then
  if ( (i OR j) in [0..7] ) then
bzw.
Delphi-Quellcode:
if (sel <> 117) AND (sel <> -1) then
  if ( (i in [0..7]) AND (j in [0..7])) then
funktioniert es.

Habe ich da jetzt einen Denkfehler? :gruebel:
Kann mir mal bitte jemand erklären, warum (sel <> (117 AND -1)) nicht das gleiche ist wie (sel <> 117) AND (sel <> -1) ??
Meines Erachtens darf sel in beiden Fällen nicht 117 UND nicht -1 sein, um die gesamte Aussage auf true zu setzen.
Und bei (sel <> (117 OR -1)) muss doch theoretisch nur eine Bedinung erfüllt sein: Also wenn (sel = -1) ist, ist (sel <> 117) immer noch erfüllt und durch das OR wird die Aussage wahr, oder nicht? :wiejetzt:

So denke ich das jedenfalls, aber anscheinend habe ich da irgendwo einen Denkfehler drin, den ich im Moment nicht finde! :coder2:

Bitte um Aufklärung :warn:

Neotracer64 10. Okt 2007 20:29

Re: bool'sches Verständigungsproblem
 
Was du da zum Teil durchführst ist beispielweise eine bitweise AND-Operation.
Nehmen wir mal den Ausdruck "(117 AND -1)". Da kommt die Zahl 117 raus und kein Boolean-Wert.
Dann wird aus deinem Ausdruck "if (sel <> (117 AND -1)) then ..." ein "if (sel <> 117) then ..."

Zum testen:
Delphi-Quellcode:
var int: Integer;
begin
  int := (117 and -1);
  ShowMessage(IntToStr(int));

Zum nachlesen:
http://de.wikipedia.org/wiki/Bitweiser_Operator

xZise 10. Okt 2007 20:33

Re: bool'sches Verständigungsproblem
 
Leider unterstüzt Delphi nicht direkt einen Wert auf mehrere Werte zu überprüfen.
Einzige Ausnahme ist case, aber das steht nicht zur debatte.

Ansonsten gibts hier ein Tutorial zu Binäroperationen (oder so xD).
Als würde 117 AND -1 einen ganz neuen Wert liefern. Dieser wird mit "sel" getestet:

Beispiel:
4 = (4 AND 2)

Binär:
Zitat:

4 and 2 =>
100 and 010 =>
110 => 6
Ergebnis ist, dass 4 = 6 falsch ist.

Binär mit or:
Zitat:

4 or 2 =>
100 or 010 =>
110 => 6 (okay schlechtes Beispiel)
MfG
xZise

[redbox]117 and -1 = 117?
Das würde ich bezweifeln:
Wir erstellen einen 4bitter mit Vorzeichen:
Zitat:

0000 = 0
1. Bit = Vorzeichen
2. - 4. Bit = Zahl
Also machen wir mal (7 and -1):
Zitat:

0111 = 7
1001 = -1
1111 = -7 => Ergebnis ist nicht 7 :)
[/redbox]

Neotracer64 10. Okt 2007 20:37

Re: bool'sches Verständigungsproblem
 
32 Bit Größe -> Dword. Und Zweierkomplement.

Zitat:

00000000000000000000000001110101 //117
11111111111111111111111111111111 // -1
================================
00000000000000000000000001110101
:P

Zum Nachlesen:
http://de.wikipedia.org/wiki/Zweierkomplement

Khabarakh 10. Okt 2007 20:43

Re: bool'sches Verständigungsproblem
 
Zitat:

Zitat von xZise
okay schlechtes Beispiel

Nicht schlecht, aber falsch gerechnet. 4 and 2 = 0

Code:
&|0 1
-+---
0|0 0
1|0 1

programmierer 10. Okt 2007 20:51

Re: bool'sches Verständigungsproblem
 
OK, das mit (sel <> (117 AND -1) ) ist klar. Ist es das gleiche mit der zweiten Abfrage auch, oder läuft es dort wieder anders?

Ich werde mir gleich mal die angegebenen Wikipedia-Artikel durchlesen.

Danke

Neotracer64 10. Okt 2007 20:57

Re: bool'sches Verständigungsproblem
 
NOT, AND, OR und XOR sind in Delphi gleichzeitig entweder logische oder bitweise Operatoren.
Wenn du zwei Boolean Werte/Ausdrücke mit diesen verknüpfst, dann erhälst du auch ein Wahrheitswert als Ergebnis.
Verknüfpst du dagegen zwei Zahlenwerte erhälst du jeweils das Ergebnis der bitweisen Operation.

programmierer 10. Okt 2007 21:03

Re: bool'sches Verständigungsproblem
 
ok, alles klar.
Also gibt es auch in Delphi keine Speziellen Operatoren für so ein Beispiel?
Da muss ich alles auseinander nehmen und einzeln aufschreiben!?

Neotracer64 10. Okt 2007 21:07

Re: bool'sches Verständigungsproblem
 
Ja.
So wie du es hier [1] schonmal hattest ist es richtig:

[1]
Delphi-Quellcode:
if (sel <> 117) AND (sel <> -1) then
  if ( (i in [0..7]) AND (j in [0..7])) then


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:04 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