Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Unterschiedlichen Wert finden

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 <
000
13.02.2005, 23:55 Uhr
virtual
Sexiest Bit alive
(Operator)


Hallo,
angenommen, ich habe einen C source mit drei Defines, deren exakten Wert ich nicht kenne (und der auch potentiell auf verschiedenen Systemen unterschiedlich sein kann):

C++:
#define A ???
#define B ???
#define C ???


Ich weiss lediglich, dass A!=B, B!=C und A!=C gilt.
Nun möchte ich ein enum bauen, der Form:

C++:
enum mapped {
    EA = A,
    EB = B,
    EC = C,
    ED = ???
};


Gibt es einen Weg, ED so zu wählen, dass der Wert nachher garantiert von EA, EB und EC verschieden ist. So triviale "Lösungen" wie

C++:
ED = EA + EB + EC
ED = EA|EB|EC


gehen nicht, denn zB bei
EA=-1, EB=0, EC=1 ist ED=EA+EB+EC=0==EB
EA=1,EB=2,EC=3 ist ED=EA|EB|EC=3==EC


Ich bin fast Der Meinung, daß das nicht geht. Weiß jemand Rat?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.02.2005, 23:59 Uhr
0xdeadbeef
Gott
(Operator)


Klar gehts.

C++:
ED = (~A & 4) | (~B & 2) | (~C & 1);


Auf die Art ist ED durch dritte Bit von A, durch das zweite von B und durch das erste von C verschieden. Naja - jedenfalls gehts, wenn du nicht grad auf ner 2bit-maschine arbeitest
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 14.02.2005 um 00:02 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.02.2005, 00:07 Uhr
enno-tyrant
Frag nicht!



C++:
void tausch(int &a,int &b)
{
   int temp=a;
   a=b;
   b=temp;
};




C++:
void sortier(int *px,int *py)
{
   if(*px>*py)
      tausch(px,py);
};




C++:
void sort(int *pa,int *pb,int *pc)
{
   sortier(pa,pb);
   sortier(pa,pc);
   sortier(pb,pc);
};



wäre ne möglichkeit die werte der größe nach zu sortieren, nun müßtest du returnwerte ins enum übergeben

//edit oder wies 0xdeadbeef sagt
--
...um etwas zu verstehen muß man wissen wie es funktioniert...

Dieser Post wurde am 14.02.2005 um 00:08 Uhr von enno-tyrant editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.02.2005, 00:10 Uhr
0xdeadbeef
Gott
(Operator)


Uh...enno-tyrant, ich hab ernsthafte Zweifel daran, dass dein Ansatz zur Compilezeit funktioniert...
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.02.2005, 00:12 Uhr
virtual
Sexiest Bit alive
(Operator)


Ja, das ist elegant!
Ich habe zwischenzeitlich auch eine Lösung gefunden, aber Deine ist besser. Meine Lösung bestand darin, quasi die Maximum von A,B,C +1 zu wählen. Aber abgesehen davon, daß dann der sehr spezielle Fall, wo einer der drei Werte bereits max_int und ein anderer min_int ist, nicht funktionieren würde, ist er erforderliche Ausdruck doch deutlich komplizierter als der Deinige, weil ich ja max nicht als Funktion verwenden darf...)
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.02.2005, 00:17 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


beträge addieren?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.02.2005, 08:38 Uhr
enno-tyrant
Frag nicht!


eine gaaanz simple lösung:

C++:
ED = EA*EA + EB*EB + EC*EC



für EA=-2, EB=0, EC=2 ist ED=EA+EB+EC=8
für EA=1, EB=0, EC=2 ist ED=EA+EB+EC=5

deine ansprüche wäre erfüllt
--
...um etwas zu verstehen muß man wissen wie es funktioniert...

Dieser Post wurde am 14.02.2005 um 08:41 Uhr von enno-tyrant editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.02.2005, 09:31 Uhr
virtual
Sexiest Bit alive
(Operator)


@enno-tyrant

Nicht wirklich, betrachte zB EA=0x7fffffff, EB=0, EC=1. Dann ist EA==ED.

Generell sind wohl nur Bitoperationen an der Stelle wirklich 100%ig, weil die meisten arithemetischen Operationen potentiell einen Überlauf verursachen können und damit die Gefahr ist, daß ED einen bereits vorhandenen Wert hat. Daher ist beefies Lösung die beste.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: