bit verknüpfungen: seltsames verhalten



  • hi!
    man betrachte folgenden source code:

    unsigned a = 0;
    
            if (~a & 0xF == 0xF)                                   
                    printf("true\n");
            else
                    printf("false\n");
    
            a -= 40;                                                
    
            if (a & 0xF == 0xF)
                    printf("true\n");
            else
                    printf("false\n");
    

    wieso krieg ich
    true
    false

    anstatt
    true
    true

    als output???

    bitte um hilfe
    danke sehr



  • Weil a & 0xF == 0 ist.

    "~" beim 2-ten if vergessen?

    Jockel



  • nein, denn beim 2. if ist das höchstwertige bit ohnehin F, weil durch -=40 eine Bereichsunterschreitung aufgetreten ist!



  • Ich weiss zwar eh nicht was das ganze soll, aber debug doch einfach:

    a = 0xffffffd8

    Wie das == 0x0000000f werden soll, weiss ich nicht.

    Jockel



  • 🙄
    eben... ich bin vor ein paar Minuten selbst draufgekommen, dass es natürlich mit 0xF0000000 verknüpft werden muss!!!

    außerdem muss die & Verknüpfung in ein Klammernpaar gefasst werden...

    das problem ist hiermit gelöst

    thx
    /dev/null



  • Ich weiss nach wie vor nicht was du machen willst,
    aber irgendwie hab ich das Gefühl, dass du a auf < 0 überprüfen
    willst ?!
    Falls ja, dann ist das Quatsch.

    Jockel



  • doch, du liegst schon richtig, allerdings ist es in meinem fall kein quatsch:

    Ich schreibe einen Hexeditor der files bis zu 4 GB aufmachen kann (max UINT wertebereich). wenn ich die cursorposition um eine größere anzahl von bytes dekrementiere muss ich vorher abfragen ob das überhaupt noch geht oder ob ich schon oben angelangt bin (und andere berechnungen auch noch). Das kann ich in meinem fall nicht durch ein einfaches < 0 lösen weil das logischerweise bei UINT niemals eintritt. Und genau deshalb habe ich mir dieses verfahren überlegt - und das funktioniert auch bestens!

    mfG
    matthias



  • int pos; 
    int decrement;
    
    if (decrement > pos)
     pos = 0;
    else
     pos -= decrement;
    

    ??



  • Kann nicht funktionieren!
    Kann es sein, dass du 0x80... (also binär 1000...) statt
    0xF0...(binär 1111000...) haben willst?

    Jockel



  • nein, ich gehe davon aus dass der zu subtrahierende wert nicht sooo rießig ist, dass es die bits bis ganz vorne betrifft


Log in to reply