Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » && und || checks optimieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
10.09.2006, 17:32 Uhr
~Gast8899
Gast


Gibt es eine webseite oder so bei der man Verknüpfungen
von booleans eingeben kann und die berechnet einem eine
optimierte Version davon ?

Ich hab:


C++:
if (!(Child[2] || Child[1]) && m->NeighbourB->SubDivide || (Child[1] && !Child[2])  || (!Child[1] && Child[2]))


wobei alles bool variablen sind und würde gerne wissen ob
es noch eine vereinfachte/zusammengefasste version gibt
die aber 100% genau das gleiche liefert

Ich weiß das der aktuelle VC++ compiler schon viel optimiert
aber keine Ahnung ob der das noch superduper analysiert
und umbaut. Er wird es bestimmt schon irgendwie optimieren
aber wie weit weiß ich nicht und das disassembly würde ich
jetzt dafür nicht unbedingt analysieren wollen


Also villeicht gibt es ja so eine page ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.09.2006, 17:37 Uhr
Blubber2063



Naja also da du dort ja mehrfach die selben Ausdrücke verwendest lässt sich das bestimmt besser checken, jetzt aber keine Lust das umzuformen. Weiss jetzt grad keine Seite auswendig wo das drauf steht, aber es gibt da so ein paar Möglichkeiten. Und bei so nem kleinen Ding könnte man KV Tafeln benutzen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.09.2006, 17:42 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Auf den ersten Blick würde ich mal sagen da die dinger alle verordert sind ist die erste bedingung restriktiver als die 2. so dass nur nen XOR zwischen Child[1] und Child[2] übrig bleibt...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.09.2006, 17:56 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


auf den zweiten blick

hab ne klammer falsch gesehen...

so müsste es stimmen, habs aber nicht getestet

C++:
if (!Child[2] && !Child[1] && m->NeighbourB->SubDivide || Child[1]^Child[2])


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 10.09.2006 um 17:56 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.09.2006, 18:09 Uhr
Blubber2063



Also wenn ich mich nicht vertan hab kannst du schreiben:
ups Klammer übersehen:

C++:
if ((!child[1] && child[2]) || (!child[2] && (child[1] || m->NeighbourB->SubDivide)))


Habs jetzt auch mal durch Compiler gejagt sollte stimmen. Also kürzer dürfte es auch nicht gehen, hab jetzt eigentlich per KV Tafel soweit optimiert wie es geht, evtl. machst ne Konjunktive Normalform draus, kann sein das es dann weniger Operationen sind, glaub ich aber nicht.

Die Version von Windalf ist ebenfalls korrekt getestet.

Dieser Post wurde am 10.09.2006 um 19:02 Uhr von Blubber2063 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.09.2006, 10:08 Uhr
stephanw
localhorst


Preisfrage: Wer sieht dem Code an, was passiert ?

Meiner Meinung nach sollte dort erstmal aufgeräumt werden und diverse Teilausdrücke zu aussagekräftigen Variablen zusammengefasst werden, so in der Art...

C++:
const bool hasAnyChild = ( child[0] != 0 || child[1] != 0 );
// ...


Bevor Du so etwas von Hand optimierst, solltest Du ganz genau wissen, dass Du dort Zeit verlierst (was ich nicht glaube).
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.09.2006, 11:23 Uhr
0xdeadbeef
Gott
(Operator)


@Windalf: ^ ist binäres XOR, das haut bei integern nicht zwingend hin, bzw. du musst es erst "normalisieren". Außerdem lässt sich im ersten Ausdruck eins der Kinder wegoptimieren, wg. (!a ^ !b ^ !c) v (!a ^ b) = (!a ^ b) v (!a ^ !c). Raus kommt dabei dann

C++:
if(!Child[1] && m->NeighbourB->SubDivide || (!!Child[1] ^ !!Child[2])) {
  ...
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
11.09.2006, 11:34 Uhr
Blubber2063



Jo das ist richtig, so grosse Ausdrücke sind nicht unbedingt Leserlich, aber ich finde bei bis zu 4 Variablen hat man das mit KV Tavel schnell minimiert, bei mehr Variablen würde ich mir das auch mehrfach überlegen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
11.09.2006, 11:35 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@beefy
aufgabenstellung lesen (hmm aber im ernst müsste bool nicht im allgemeinen so abgebildet sein das es funzt)


Zitat:

wobei alles bool variablen sind und würde gerne wissen ob




Bearbeitung:

argh Montag morgen. In Frankfurt ist es Scheisse und ich muss mich mit irgendwelchen ICE Radsätzen rumärgern... Die Woche kann nur beschissen werden...


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 11.09.2006 um 11:40 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
11.09.2006, 12:05 Uhr
ao

(Operator)



Zitat von Windalf:
aber im ernst müsste bool nicht im allgemeinen so abgebildet sein das es funzt

Ja, müsste, weil Bool-Ausdrücke vor Anwendung eines Bit-Operators implizit nach Integer konvertiert werden. Das ist aber gar nicht nötig, denn ein XOR mit zwei bools schreibt man am einfachsten so:

C++:
bool a = ...;
bool b = ...;
if (a != b)
{
    ...
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: