Verschiebeoperator in C#



  • Hallo,

    jetzt hab´ ich alles durchprobiert. Ich sehe meinen Fehler nicht.
    Oder funktioniert der Verschiebeoperator bei C# nicht so wie in C/C++.

    private bool FlagMarker(int i_value, UInt32 i_flags)
            {
                bool B_ret = false;
    
                UInt32 i_temp_flag = 0x00000001 << Convert.ToUInt32(i_value);
    
                if ((i_temp_flag & i_flags) == (i_temp_flag))
                {
                    B_ret = true;
                }
    
                return B_ret;
            }
    

    Folgende Fehlermeldung:
    Der Operator "<<" kann nicht auf Operanden vom Typ "int" und "uint" angewendet werden.



  • Naja, alles scheinst du noch nicht durchprobiert zu haben.
    Z.B. 0x0000001 gemäß Fehlermeldung in ein uint zu casten, hast du vergessen.



  • private bool FlagMarker(int value, uint flags) 
            { 
                uint temp = 1u << (uint)value;
    
                return (temp & flags) == temp; 
            }
    


  • Hallo,
    cast hin oder her.
    Jetzt hab ich mal alle überflüssigen casts weggelassen.
    Weniger ist mehr 😃 .

    private bool FlagMarker(int i_value, UInt32 i_flags)
            {
                bool B_ret = false;
    
                int i_temp_flag = 0x1 << i_value;
    
                if ((int)(i_temp_flag & i_flags) == (i_temp_flag))
                {
                    B_ret = true;
                }
    
                return B_ret;
            }
    

    , dann geht´s.

    Danke trotzdem.
    fujitsufan
    PS. das mit C# mach ich erst eine Woche.



  • fujitsufan schrieb:

    Jetzt hab ich mal alle überflüssigen casts weggelassen.

    Du hast noch einen vergessen. Ausserdem tummeln sich in Deinem Vergleich unnötige Klammern – und zu guter letzt ist das ganze sowieso unnötig aufwendig. Vor allem solche expliziten Zuweisungen an eine Boolean-Variable sind fast immer überflüssig.

    Und zu guter Letzt: lass die Präfixe vor den Variablen weg, die bringen nichts und irritieren bloß.

    Weniger ist mehr 😃 .

    Sehr richtig. Daher:

    private bool IsFlagSet(int value, int flags) {
        int mask = 1 << value;
        return (flags & mask) == mask;
    }
    

    EDIT: Den Funktionsnamen kann man auch anschaulicher machen. 😉


Anmelden zum Antworten