Was machen Operatoren "&" und ">>" ?



  • Was sind & und >> für Operatorn?

    In diesem Zusammenhang:

    long long b = eine_nateurliche_Zahl;
    if((b&1)!=0)   //Hier!
    {
    
    b>>=1;   //Hier 
    
    }
    


  • MisterX schrieb:

    Was sind & und >> für Operatorn?

    In diesem Zusammenhang:

    long long b = eine_nateurliche_Zahl;
    if((b&1)!=0)   //Hier!
    {
    
    b>>=1;   //Hier 
    
    }
    

    http://en.wikipedia.org/wiki/Right_shift
    http://en.wikipedia.org/wiki/Binary_and

    Damit kann man Frickeln und statt b%2!=0 statt (b&1)!=0 schreiben. Das hat aber keinen Zweck, weil der Compiler so einfache Optimierungen auch selber kann.
    http://en.wikipedia.org/wiki/Exponentiation_by_squaring#Example_implementations



  • Danke.

    So wie ich das verstehe müßte b>>=1 also eine Division durch 2 sein. Richtig?

    Bei ((b&1)!=0) wird einfach eine Zahl die nur ein Bit ganz rechts hat binär addiert und mit 0 verglichen.
    Sehe ich das richtig, dass dies ungerade Zahlen erkennt?
    (Also bei ungeraden zahlen true und bei geraden false ergibt)



  • kurz:
    "b>>=1" ist dasselbe wie "b = b/2", richtig.
    "(b&1)!=0" erkennt ungerade Zahlen wenn b ein int/long/double ... ist, richtig, es wird aber nichts addiert.

    lang:
    b ist ein long long und hat damit viele Bits, nicht nur eins. b&1 bedeutet man nehme b binär, also sowas wie
    1101011101 und verundet das mit 1. Heißt es wird Bit für Bit verglichen ob das entsprechende Bit bei beiden gesetzt ist.

    z1:  0110
    z2: &0101
    z3:  0100
    

    Das kommt raus wenn man z3 = z1&z2 bastelt. Ich hoffe das sagt dir was.
    b&1 ergibt entsprechend eine 1 wenn b hinten eine 1 hat, sonst 0. Das "!=0" tut garnichts, logisch gesehen kommt nach "!=0" immer dasselbe raus was vorher dastand.

    "if ((b&1)!=0)" bedeutet soviel wie "Wenn b hinten eine 1 hat, dann". Üblicherweise werden Zahlen so gespeichert, dass die Einerstelle bei allen Zahlen gleich bleibt und damit bei einer Binärzahl angibt, dass es eine gerade oder ungerade Zahl ist. Das kann man aber auch anders machen, zum Beispiel bei Dezimalspeicherung funktioniert das nicht, bei einem float auch nicht immer. Deshalb ist "if ((b&1)!=0)" == "Wenn b hinten eine 1 hat, dann" auf jeden Fall richtig. Ob es dasselbe wie "b ist ungerade" ist, entscheidet die Kodierung.



  • nwp2 schrieb:

    kurz:
    "b>>=1" ist dasselbe wie "b = b/2", richtig.
    "(b&1)!=0" erkennt ungerade Zahlen wenn b ein int/long/double ... ist, richtig, es wird aber nichts addiert.

    lang:
    b ist ein long long und hat damit viele Bits, nicht nur eins. b&1 bedeutet man nehme b binär, also sowas wie
    1101011101 und verundet das mit 1. Heißt es wird Bit für Bit verglichen ob das entsprechende Bit bei beiden gesetzt ist.

    z1:  0110
    z2: &0101
    z3:  0100
    

    Das kommt raus wenn man z3 = z1&z2 bastelt. Ich hoffe das sagt dir was.
    b&1 ergibt entsprechend eine 1 wenn b hinten eine 1 hat, sonst 0. Das "!=0" tut garnichts, logisch gesehen kommt nach "!=0" immer dasselbe raus was vorher dastand.

    "if ((b&1)!=0)" bedeutet soviel wie "Wenn b hinten eine 1 hat, dann". Üblicherweise werden Zahlen so gespeichert, dass die Einerstelle bei allen Zahlen gleich bleibt und damit bei einer Binärzahl angibt, dass es eine gerade oder ungerade Zahl ist. Das kann man aber auch anders machen, zum Beispiel bei Dezimalspeicherung funktioniert das nicht, bei einem float auch nicht immer. Deshalb ist "if ((b&1)!=0)" == "Wenn b hinten eine 1 hat, dann" auf jeden Fall richtig. Ob es dasselbe wie "b ist ungerade" ist, entscheidet die Kodierung.

    Danke! Jetzt habe ich es verstanden 🙂



  • nwp2 schrieb:

    "b>>=1" ist dasselbe wie "b = b/2", richtig.

    jein, es kommt auf deine absicht an, also ob der algo mit zahlen oder bitmustern arbeiten soll, bzw. arithmetisch oder digital. ausserdem darf ein compiler sogar bei negtiven zahlen links nullen reinschieben, was das vorzeichen ändert und dann ist b>>=1 nicht mehr b/2.
    🙂



  • ;fricky schrieb:

    nwp2 schrieb:

    "b>>=1" ist dasselbe wie "b = b/2", richtig.

    jein, es kommt auf deine absicht an, also ob der algo mit zahlen oder bitmustern arbeiten soll, bzw. arithmetisch oder digital. ausserdem darf ein compiler sogar bei negtiven zahlen links nullen reinschieben, was das vorzeichen ändert und dann ist b>>=1 nicht mehr b/2.
    🙂

    Echt? Erklär mal.



  • volkard schrieb:

    Echt? Erklär mal.

    hier: http://de.wikipedia.org/wiki/Bitweiser_Operator
    (unter Verschiebeoperatoren in C, C++ und Java): 'Berechnungen mit vorzeichenbehafteten Werten sind undefiniert, sofern der rechte Operand negativ ist, durch einen Linksshift sich das Vorzeichen ändert oder ein negativer Wert einem Rechtsshift unterzogen wird'
    🙂



  • ups, ich hatte glatt 'einsen' statt 'nullen' in "ausserdem darf ein compiler sogar bei negtiven zahlen links nullen reinschieben" gelesen und mich gefragt, wo da das problem sein soll.


Anmelden zum Antworten