![]() |
Boolean-Werte addieren?
Kann man Boolean-Werte eigentlich addieren? Und zwar so, dass aus der Summe ersichtlich ist, wie viele True- und wie viele False-Werte enthalten sind?
|
Re: Boolean-Werte addieren?
Da würde ich nicht von Addition reden. da wird man eher Zählen müssen
|
Re: Boolean-Werte addieren?
True entspricht 1 und false entspricht 0, wenn du also bei true immer mit 1 addierst, erhälst du die Anzahl der true-Werte. Dann müsstest du noch die Gesamtanzahl kennen, also mit true und false und daraus lässt sich dann ja alles weitere berechnen.
|
Re: Boolean-Werte addieren?
//ok, ich war zu langsam
|
Re: Boolean-Werte addieren?
Genau genommen ist False als null definiert und true als alles andere. Wenn jetzt eine Funktion 258 als wahr zurückgibt ...
|
Re: Boolean-Werte addieren?
Zitat:
Gruss Reinhard |
Re: Boolean-Werte addieren?
Zitat:
|
Re: Boolean-Werte addieren?
Jaein, also ein Integer(true) wird sicher immer 1 sein, aber Delphi hat bei WinApi-Funktionen durchaus schonmal einen Boolean als Rückgabe, die Funktion gibt aber -1 zurück.
|
Re: Boolean-Werte addieren?
Zitat:
das ist bei bitweiser Logik auch konsequent, da not 1 = $FFFF ist bei einem word usw. Genaugenommen sind das aber 16/32/... boolsche Operationen. Gruss Reinhard |
Re: Boolean-Werte addieren?
Das resultiert aber in der Verwendung von BOOLEAN und BOOL, welche sich eben in dem unterscheiden.
Delphi-Quellcode:
Geht mal Schritt für Schritt darüber und schaut euch an was herauskommt. Die Variable a, welche BOOLEAN deklariert ist, enhält INT 1. Aber b, welche als BOOL deklariert ist enthält INT -1.
var
a : BOOLEAN; b : BOOL; c , d : INTEGER; begin a := TRUE; b := TRUE; c := INTEGER(a); d := INTEGER(b); end; Edit: Um also nochmal zu der Frage des Threaderstellers zurückzukommen. Inkrementiere einfach eine Variable so oft, wie ein Wahrheitswert auftritt. Willst du noch die Gesamtzahl aller Werte wissen, so inkrementiere stets noch eine zweite Variable mit.
Delphi-Quellcode:
var
BoolVal : BOOLEAN; TrueVals, SumVals : INTEGER; {...} if BoolVal then inc(TrueVals); inc(SumVals); |
Re: Boolean-Werte addieren?
Zitat:
ungetestet, aber wie wäre es mit einem
Delphi-Quellcode:
Und dann benutzt du für deine einzelnen boolschen Ausdrücke
var
summe: array[Boolean] of Integer;
Delphi-Quellcode:
Gruß,
Inc(summe[boolausdruck]);
SirTwist |
Re: Boolean-Werte addieren?
Ich denke, es bleibt nichts anderes übrig, als stures Zählen.
Delphi-Quellcode:
Es kann entweder ein Boolean-Array übergeben werden oder
function AddBooleanValues(Values: array of boolean): integer;
var i: integer; begin result := 0; for i := 0 to high(Values) do if Values[i] then inc(result); end; ![]() |
Re: Boolean-Werte addieren?
Moin, Moin,
z. B. mit der Klasse im beiliegenden Testprogramm.
Delphi-Quellcode:
PROGRAM Project1;
{$APPTYPE CONSOLE} USES SysUtils, Windows; TYPE TAddBool = CLASS strict private fAddArray: ARRAY [0..1] OF integer; public PROCEDURE Clear; PROCEDURE add(abool: boolean); PROCEDURE print; END; {$region 'TAddBool'} PROCEDURE TAddBool.add(abool: boolean); BEGIN Inc(fAddArray[integer(not (aBool = False))]); END; PROCEDURE TAddBool.Clear; BEGIN ZeroMemory(@fAddArray, sizeof(fAddArray)); END; PROCEDURE TAddBool.print; BEGIN writeln('True: ', fAddArray[1]); writeln('False: ', fAddArray[0]); END; {$endregion} VAR AddBool: tAddBool; BEGIN AddBool := tAddbool.Create; TRY addbool.add(True); addbool.add(False); addbool.add(True); addbool.print; readln; FINALLY addbool.Free; END; END. |
Re: Boolean-Werte addieren?
Man kann auch den Ordinalwert eines Boolean bilden und um im Beispiel zu bleiben...
Delphi-Quellcode:
function AddBooleanValues(Values: array of boolean): integer;
var i: integer; begin result := 0; for i := 0 to high(Values) do result:=result + ord(Values[i]); end; |
Re: Boolean-Werte addieren?
Zitat:
@omata: Das ist halt riskant. |
Re: Boolean-Werte addieren?
Zitat:
|
Re: Boolean-Werte addieren?
Weniger riskant als eher grauenhafter Stil. Idealerweise soll Code wie Prosa lesbar sein, man liest ihn, und versteht sofort, was gemeint ist. Das hier ist weniger Prosa-Stil, sondern eher Gesetzestext-Stil. :mrgreen:
|
Re: Boolean-Werte addieren?
@3_of_8: das werde ich mir merken.
|
Re: Boolean-Werte addieren?
Im Übrigen: Der Ordinalwert von True als LongBool, wie es glaube ich bei manchen C-Versionen genutzt wird, oder zumindest, und vor allem, wie es Windows in einigen Bibliotheksfunktionen nutzt, ist $FFFFFFFF. Wenn du deinen Code also mit LongBools machst, bekommst du am Ende die Anzahl der True-Werte negativ heraus. ;)
True ist eben nicht wirklich als Boolean(1) definiert, sondern als alles, was nicht False ist, und False ist Boolean(0). |
Re: Boolean-Werte addieren?
Oh man, Leute ihr habt es immer noch begriffen. Naja egal, ich bin dann mal wieder weg.
|
Re: Boolean-Werte addieren?
omata, aus einem einfachen Grund:
Delphi-Quellcode:
Das klappt dann für jedwegen Boolean'schen Ausdruck, eben auf der Prämisse das FALSE = 0 und TRUE <> 0.
var
b : BOOLEAN; i : INTEGER; begin b := BOOLEAN(2); i := ORD(BOOLEAN(b)); end; b ist in diesem Fall TRUE, da <> 0. Das könnte in deiner Berechnung erhebliche Fehler erzeugen ... Desweiteren wollte der Threadersteller lediglich die Anzahl aller Ausdrücke und eben die Anzahl aller wahren Ausdrücke wissen. Und alle hier geposteten Funktionen und Prozeduren sind meiner Meinung nach etwas Overhead für die eigentlich gestellte Frage.
Delphi-Quellcode:
if BoolVar then INC(TrueVals);
INC(SumVals); |
Re: Boolean-Werte addieren?
Hallo,
die Routine von omata funktioniert auch für ByteBool, WordBool und LongBool (=BOOL). Die notwendige Anpassung der Werte an den gewählten Elementtyp Boolean übernimmt der Delphi-Compiler. Die Routine darf also davon ausgehen, dass der Ordinalwert der Elemente entweder 0 oder 1 ist, so wie es auch in der Hilfedatei dokumentiert ist. Ärger gibt es nur dann, wenn man (mutwillig) als Boolean verkleidete Byte-Werte übergibt. Aber das wäre so, als würde man einen Texteditor eine ausführbare Datei laden lassen. Dafür ist der in der Regel nicht ausgelegt... Gruß Hawkeye |
Re: Boolean-Werte addieren?
Ich denke ein simples Inc(n) in einer Schleife, die alle Bools überprüft (also <> 0) ist trotzdem schöner und kommt dann auch mit allem zurecht (und nebenbei ist es auchnoch unwesentlich kleiner im Code).
Aber die Diskussionm ob man Boolean jetzt sicher als 1 annehmen darf oder nichtm gabs hier schon ein paar mal. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21: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