Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » platformunabhängiges xor auf pointer

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
12.11.2012, 12:57 Uhr
wanne



Hi,

Ich habe folgende Anweisung (p und q sind vom Typ void*):

C++:
p=(long)p^(long)q;

Das funktioniert auf üblichen PCs. Ich würde das aber gerne allgemeiner machen. Also p und q verxoren auf der länge des pointers. (rein theoretisch könnte es ja sein, dass die Länge von pointern nichteinmal ein vielfaches von int ist. gibt es eine einfache Möglichkeit für sowas ohne bit für bit drüber zu fahren?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.11.2012, 08:29 Uhr
ao

(Operator)


Die Bit-Operatoren (&, |, ^, ~) sind für Pointer-Typen alle nicht definiert, wenn mich nicht alles täuscht. Also wie willst du das machen, "Bit für Bit" über einen Pointer zu fahren, ohne int-Cast?

Du könntest zur Compilezeit einen Test machen:

C++:
#if (sizeof (void*) == sizeof (unsigned int))
/* Pointer und unsigned int sind gleich groß,
   verlustfreies Casten ist moeglich */

#elif (sizeof (void*) == sizeof (unsigned long))
/* dasselbe mit unsigned long */
#else
/* Sonderfall: Pointer haben eine abweichende Groesse.
   Gedanken machen, wenns soweit ist.
   Bis dahin erst mal aussteigen. */

#error Pointer size mismatch
#endif


Nimm für die Casterei besser unsigned-Typen, weil man bei Bit-Operationen mit Signed-Typen schon mal mit ungewollter Sign-Extension rechnen muss.

Die Mutter aller Fragen ist aber: Wozu soll das gut sein? Wozu willst du Pointer verXORen?

Dieser Post wurde am 13.11.2012 um 08:33 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.11.2012, 09:13 Uhr
Tommix



'Morgen,
sizeof funktioniert mit dem Präprozessor nicht.
www2.informatik.uni-halle.de/lehre/c/c_if.html
(Ganz unten.)

Man könnte aber zur Laufzeit mit Hilfe von sizeof byteweise arbeiten.
Die Frage nach dem Sinn stellt sich mir allerdings auch.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.11.2012, 10:07 Uhr
ao

(Operator)


Ups. Sorry. Hätte ich beim Ausprobieren sicher auch gemerkt

Na ja, das verstärkt noch die Betonung der Frage "was soll das überhaupt?"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.11.2012, 20:21 Uhr
TOSHMAX



Eine andere Möglichkeit wäre noch uintptr_t (aus <cstdint> bzw. <stdint.h>. Die Größe dieses Integers ist größer oder gleich der eines Pointers. Allerdings muss er vom Compiler unterstützt sein (sollte er aber in der Regel sein). xor sollte sich ohne Probleme darauf anwenden lassen.

Als kleines Beispiel, wo es von Nutzen ist: http://en.wikipedia.org/wiki/XOR_linked_list
Über die Praxisrelevanz lässt sich natürlich streiten.
 
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: