Frage zum Operator ~



  • Ich habe folgendes zum dem Operator gefunden: http://www.cplusplus.com/doc/tutorial/operators/

    operator | ASM | description
    ~ | NOT | Unary complement (bit inversion)

    Aber was ist eine "unäre komplette (bit inversion)"?

    Und wie setzt man den Operator in C++ ein?

    int a = 4;
    _asm
    {
     NOT a
    }
    cout<<a<<endl;
    

    Oh, hab noch eine genauere Erklärung gefunden: http://www.i8086.de/asm/8086-88-asm-not.html

    4 = 100
    4 invertiert = 011 = 2

    Wieso bekomm ich -5 raus 😕



  • Die restlichen Bits hast du einfach mal so unterschlagen. Angenommen, ein int hätte 1 Byte:

    0000 0100 = 4
    1111 1011 = -128+64+32+16+8+2+1 = -5
    


  • Probier's mal mit unsigned Datentypen. 😉
    PS: 011 ist 3, nicht 2.



  • Und wie kommst Du auf "unäre komplette"? Lies das englische Wort nochmal 😉



  • cooky451 schrieb:

    Probier's mal mit unsigned Datentypen. 😉

    Auch dann ist es keine 3. 😃



  • out schrieb:

    cooky451 schrieb:

    Probier's mal mit unsigned Datentypen. 😉

    Auch dann ist es keine 3. 😃

    Hm... das stimmt. 🤡
    Edit: Probier's mal mit einem genau 3 bit großen unsigned Datentypen..



  • Here you go:

    #include <bitset>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	bitset<3> threeBits(4);
    
    	std::cout << (~threeBits).to_ulong();
    }
    

    Jedoch ist 011 nicht 2 😉



  • Eine bitweise Negierung ist nichts anderes als das Umkehren des Wertes jedes Bits. Also für jedes Bit bit im Speicher bit = ! bit.
    Das lustige ist jetzt, dass Zahlen intern anders notiert werden als du wahrscheinlich denkst. Und deswegen sind Vorzeichenbehaftete Zahlen da auch etwas tricky.

    Man kann für vorzeichenlose Skalare statt ~a auch a ^= std::numeric_limits<unsigned>::max() schreiben (angenommen, a ist vom Typ unsigned )..
    Das heißt nichts anderes als (für bspw. 32-Bit Maschinen):

    00110010 00000000 00000000 00000000
    ^ 11111111 11111111 11111111 11111111
    = 110011.......
    


  • Sone schrieb:

    Eine bitweise Negierung ist nichts anderes als das Umkehren des Wertes jedes Bits. Also für jedes Bit bit im Speicher bit = ! bit.
    Das lustige ist jetzt, dass Zahlen intern anders notiert werden als du wahrscheinlich denkst. Und deswegen sind Vorzeichenbehaftete Zahlen da auch etwas tricky.

    Wovon redest du? Was soll dabei tricky sein? Da ist rein gar nichts tricky und es gibt auch keine Probleme dabei. Das Problem des TE war einfach nur, dass er gedacht hat, seine Variable bestünde aus 3 Bits, nicht mehr und nicht weniger.


Anmelden zum Antworten