Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Hilfe bei einem Operator

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
04.12.2007, 11:59 Uhr
dave_sh



hi leute, ich bitte um eure Hilfe. Da ich im google nix passendes finde, wende ich mich an euch
und zwar habe ich folgenden code:


C++:
005 void tausche(int &a, int &b)
006 {
007 if (a != b)
008 {
009 b = a ^ b;
010 a = b ^ a;
011 b = a ^ b;
012 }
013 }
014
015
016
017 int main() {
018
019 int a, b;
020
021 cout << "Geben sie zwei Zahlen ein: " ;
022
023 cin >> a ;
024 cin >> b ;
025 cout << "a=" << a << "  b=" << b << endl;
026
027 tausche(a,b);
028
029 cout << "a und b vertauscht ergibt:" << endl;
030 cout << "a=" << a << "  b=" << b << endl;
031
032
033 return 0;


dieses programm tauscht 2 zahlen um die man eingeben hat. nur ich weiß nicht wie das programm es macht? was passiert da genau und wie, in zeile 9,10,11

danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.12.2007, 12:38 Uhr
Pablo
Supertux
(Operator)


der ^-Operator ist XOR
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.12.2007, 13:22 Uhr
ao

(Operator)


http://de.wikipedia.org/wiki/XOR

Der ^-Operator bedeutet, dass jedes Bit von a mit dem gleichen Bit von b xor-verknüpft wird.

Die XOR-Verknüpfung ist assoziativ: (a^b)^c = a^(b^c) und kommutativ:a^b = b^a,
damit lassen sich die Ausdrücke in tausche() so umformen:

C++:
void tausche(int &a, int &b)
{
    if (a != b)
    {
        b = a ^ b; // (1)
        a = a ^ b; // (1) einsetzen: = a^(a^b) = (a^a)^b = 0^b = b (2)
        b = a ^ b; // (1) und (2) einsetzen: = b^(a^b) = (b^b)^a = 0^a = a
    }
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.12.2007, 13:41 Uhr
dave_sh



also wenn ich jetzt für a=3 und für b=4 nehme, wie würde das dann ausschauen?
und noch eine frage was bedeutet dieses "&" bei (int &a, int &b)

sorry aber kenn mich bei diesen operatoren überhaupt nicht aus...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.12.2007, 13:51 Uhr
ao

(Operator)


Ich schreib mal nur die untersten 4 Bits hin, die höheren sind alle 0, also 0^0=0
Für a = 3 (0011) und b = 4 (0100):

(1) b = 0011 ^ 0100 = 0111 = 7
(2) a = 0011 ^ 0111 = 0100 = 4
(3) b = 0100 ^ 0111 = 0011 = 3

Das & macht einen Parameter zum Referenzparameter.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.12.2007, 14:34 Uhr
dave_sh



danke jetzt versteh ich!! eine kleine frage noch: wo kann ich sehen, wie eine zahl in bits ausschaut?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.12.2007, 15:03 Uhr
ao

(Operator)


Echte Programmierer wissen das: "Mein neuer PC kostet 11 1110 0111 Euro"

Nee, entweder eben zu Fuß ausrechnen (Zahl in Zweierpotenzen zerlegen), oder den Windows-Taschenrechner bemühen oder irgendein anderes Bitfrickel-Werkzeug.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
04.12.2007, 15:14 Uhr
xXx
Devil


Ehm gibt es nen Algorithmus für ...

Code:
(48)_10 = (x)_2

48 / 2 = 24 | 0
24 / 2 = 12 | 0
12 / 2 = 06 | 0
06 / 2 = 03 | 0
03 / 2 = 01 | 1
01 / 2 = 00 | 1
x = 11 00 00
Man teilt durch 2 bis 0 als Ergebnis herauskommt und notiert dabei die Reste. Von unten nach oben gelesen ergeben diese nun die Dualzahl(Binärzahl).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
04.12.2007, 22:45 Uhr
Hans
Library Walker
(Operator)


Hi,

zu dieser Methode, den Wert zweier Variablen zu tauschen, sollte man noch anmerken, dass das nur mit ganzen Zahlen funktioniert, aber sonst nicht.
Bemerkenswert ist auch, das die Methode ohne eine Hilfsvariable auskommt, wo man einen Wert zwischenspeichert, aber das ist heutzutage eher Belanglos. Man sollte es sich nur merken, falls ein Lehrer beim Thema Bitverarbeitung darauf herum reitet.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
05.12.2007, 09:11 Uhr
ao

(Operator)



Zitat von Hans:
zu dieser Methode, den Wert zweier Variablen zu tauschen, sollte man noch anmerken, dass das nur mit ganzen Zahlen funktioniert, aber sonst nicht.

Die Methode tauscht zwei beliebige Bitmuster, egal, was sie darstellen. Theoretisch könnte man auch komplette Objekte tauschen, nur der C++-Compiler lässt das nicht zu, der will die Bitoperatoren nur auf Ganzzahlen anwenden.

Da kommt mir eine Idee ... man kann dem Compiler doch unterschieben, was man will ...

C++:
#include <iostream>
#include <string>

using namespace std;

template <typename T>
void swapp (T & a, T & b)
{
    unsigned char * pa = (unsigned char *) &a; // char-Pointer auf
    unsigned char * pb = (unsigned char *) &b; // die Objekte holen

    for (int i = 0; i < sizeof (T); i++) // Objekte byte-weise tauschen
    {
        pb[i] = pa[i] ^ pb[i];
        pa[i] = pa[i] ^ pb[i];
        pb[i] = pa[i] ^ pb[i];
    }
}

int main()
{
    string a = "Hallo";
    string b = "Welt";

    cout << "a = " << a << " b = " << b << endl; // a = Hallo b = Welt

    swapp (a, b);

    cout << "a = " << a << " b = " << b << endl; // a = Welt b = Hallo

    return 0;
}


Schlucken eure Compiler das? Meiner ja.

ao

Dieser Post wurde am 05.12.2007 um 09:12 Uhr von ao editiert.
 
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: