Least Significant Bit



  • Hi Leute

    Steh grade komplett auf dem schlauch und brauch eure hilfe,

    ich muss hier gerade mit bitshift die 2 LSB eines Farbkanals herausfinden.

    meine überlegung war:

    int mask = 0x11;
    int buffer = 0;
    int out = 0x0;
    
    buffer = (int)image.col(x_counter).row(y_counter).ptr()[c_counter] // das is nur für den farbkanalzugriff
    out = buffer & mask;
    

    aus der theorie heraus sollte bei einem buffer wert von 242 schlussendlich im out 00000010 stehen, tuts aber nicht, es steht (dezimalwert) 17 also das falsche drinnen. irgendwo hab ich nen denkfehler aber ich komm net drauf, kann mir einer helfen ?



  • hmmm also 242 ist 11110010 wenn mich nich alles taeuscht. Die letzten beiden bits sind 10 das ist schon mal richtig.
    Das bitweise & ist auch richtig.
    Der Fehler ist also wo anders angesiedelt...
    Kontollier mal ob du mit out noch irgendwas anderes machst...
    Wie kommst du denn auf den wert von out ... gibst du den vielleicht falsch aus oder schaust du in den Speicher?
    Allerdings kannst Du auch nicht mit den endians durcheinander gekommen sein weil du keine 2 einsen in out haben solltest.



  • Aber
    mask = 0x11;
    ist 1 0001
    also 242 & 0x11 sollte eigentlich 1 0000 ergeben, also 16 ...



  • Ich glaube du verwechselst 0x (für Hexadezimalwert) mit einem binären Wert.

    0x11 ist Hexadezimal und daher 17 bzw. 10001 als Binärzahl.
    Binäre Werte wie 11 kann man in C und C++ nicht schreiben. Du musst also einen dezimalen oder einen hexadezimalen Wert benutzen um diesen darzustellen. Daher 2 oder 0x2.

    int mask = 0x2;
    


  • richtig 0x3 ist natuerlich richtig



  • Falls er die beiden niedrigsten Bits maskieren will:
    int mask = 3;
    oder auch 0x3



  • Osbios schrieb:

    Binäre Werte wie 11 kann man in C und C++ nicht schreiben. Du musst also einen dezimalen oder einen hexadezimalen Wert benutzen um diesen darzustellen. Daher 2 oder 0x2.

    int mask = 0x2;
    

    Dann aber

    int mask = 0x3;
    

    🙂



  • Osbios schrieb:

    Ich glaube du verwechselst 0x (für Hexadezimalwert) mit einem binären Wert.

    0x11 ist Hexadezimal und daher 17 bzw. 10001 als Binärzahl.
    Binäre Werte wie 11 kann man in C und C++ nicht schreiben. Du musst also einen dezimalen oder einen hexadezimalen Wert benutzen um diesen darzustellen. Daher 2 oder 0x2.

    int mask = 0x2;
    

    das wars 🙂 danke,
    die werte hab ich im debug modus vom visual studio ausgelesen.

    jetzt muss ichs nur noch zusammenstückeln, nen farbabgleich machen und zurück ins pic schreiben 😉



  • Sorry, 0x3 ist natürlich richtig... ich hab wohl geschielt und mich von deinem 00000010 Endergebnis ablenken lassen. xD



  • noch mal danke 😃 bin jetzt halt vom ergebniss teilweise noch verwirrt 😛
    glaub hab da noch was anderes übersehen ^^

    Aber das, ist eine andere geschichte 😃


Anmelden zum Antworten