Bitweise rechnen (a&)



  • Es geht um folgenden Quellcode

    #include <iostream>
    using namespace std;
    
    class myClass
    {
    private:
    	long int zahl;
    public:
    	myClass( long n)
    		: zahl(n)
    	{
    	}
    	double algo ()
    	{
    		double x=2,y=1,z=1;
    		long a=1;
    		while (a<zahl)
    		{
    			z*=(x/y);
    			if(a&1)
    				y+=2.0;
    			else
    				x +=2.0;
    			a++;
    			cout << z*2.0 << endl;
    		}
    		return z;
    	}
    };
    
    int main()
    {
    	myClass * cPtr;
    	cPtr = new myClass (11);
    	cPtr->algo();
    }
    

    Die unübersichtliche Formatierung ist wohl so gewollt (Klausuraufgabe).
    ~edit von volkard: Aber trotzdem hättest Du hier übersichtlich formatieren müssen. Du tätest das ja auch zum Lösen selber tun machen.~

    Die Ausgabe die wir als Lösung angeben sollen lautet:
    1. 4
    2. 2,666666
    3. 3,555555
    .....
    10. 3,00218

    Ich frag mich nur wieso^^ klar ist das die funktion double algo () mit dem wert 11 "gefüttert" wird und ausgeführt wird. also ist zahl 11. dadurch erhält man die 10 ausgaben da die bedingung "solang a<10 a++" lautet.
    z = z*(x/y) kein problem abber jetzt kommt if (a&1) usw.
    ich verstehe nicht was da passiert -.-
    mein ansatz ist das die zahl als binarzähl geschrieben wird und dann bitweise addiert wird. das heißt wenn beide binärzahlen an der gleichen stelle eine 1 haben ist die summe auch 1 ansnsten 0. aber wie genau erfolgt die verrechnung...
    hoffe jemand kann mir es kurz erläutern 🙂



  • Hilft evtl. schon (Pseudocode)

    if a ist ungerade
        y+=2.0; 
    else if a ist gerade
        x +=2.0;
    

    Bitweises And und 1 (a & 1) überprüft ja nur, ob das LSB gesetzt ist oder nicht, anders geschrieben:

    if(!(a % 2 == 0))
    


  • kenn mich mit bitweise nich so gut aus. was ist mit lsb gemeint?
    was genau hat "y+=2.0; else x +=2.0;" für auswirkungen auf die ausgabe?



  • Juleian* schrieb:

    kenn mich mit bitweise nich so gut aus. was ist mit lsb gemeint?

    LSB

    Juleian* schrieb:

    was genau hat "y+=2.0; else x +=2.0;" für auswirkungen auf die ausgabe?

    Äh, etwa hier

    z*=(x/y);
    cout << z*2.0 << endl;
    


  • nun gut aber dann wär doch beim ertsen durchlauf die ausgabe so:
    a=1 also ungerade, also gilt y= y+2 also ist y 3.
    somit gilt z= z*(x/y) also z= 1*(2/3)--> z =0,6666666666...
    cout z*2.0 ---> somit müsste doch die ausgabe 1,66666666 lauten.
    der compiler gibt aber 4 aus. ich glaub ich versteh da was falsch oder? 😃



  • ich meine 1,2222222 😉



  • Juleian* schrieb:

    nun gut aber dann wär doch beim ertsen durchlauf die ausgabe so:
    a=1 also ungerade, also gilt y= y+2 also ist y 3.
    somit gilt z= z*(x/y) also z= 1*(2/3)--> z =0,6666666666...

    Stimmt soweit. Allerdings hast du den nullten Durchlauf vergessen. Denn z wird bereits vor dem von dir angeschauten "ertsen" Durchlauf neu gesetzt auf z=2/1=2. Daher die Ausgabe 4.
    Damit wäre beim zweiten Durchlauf z=2*(2/3) (die 2/3 hast du ja schön ausgerechnet) und z*2 wäre 8/3=2+2/3=2,666666.
    Stimmt doch alles.


Anmelden zum Antworten