Ankündigung

Einklappen
Keine Ankündigung bisher.

Bitweise Negation

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Bitweise Negation

    Hallo,

    kann mir jemand bitte einfach erklären, warum aus ~23 eine -24 Zahl wird?

    Beispiel: echo ~23 //Ausgabe -24

    Ich habe das so verstanden:

    Zuerst schreiben wir 23 (binär) auf:
    128/64/32/16/8/4/2/1 (TABELLE)

    0 0 0 1 0 1 1 1 = 23
    Jetzt flippen wir die Zahlen:
    1 1 1 0 1 0 0 0 (MSB wird anscheinend automatisch gesetzt?) und addieren eine 1:
    1 1 1 0 1 0 0 0
    +
    0 0 0 0 0 0 0 1
    =
    1 1 1 0 1 0 0 1
    Um jetzt herauskriegen, welcher Zahl das laut TABELLE entspricht, muss man die Zahl wieder flippen:
    0 0 0 1 0 1 1 0 = (minus)22

    Also ich komme auf 22 und nicht 24.
    Ich habe diese Seite http://www.cl.uni-heidelberg.de/kurs...l/page014.html benutzt.

    Vielen Dank!

  • #2
    Not füllt vor dem Flippen alls maximal mögliche Stellen mit Null auf:
    PHP-Code:
    echo decbin (23); // 10111
    echo decbin (~23); // 11111111111111111111111111101000 
    [edit]
    und überschreitet nach flippen den BIT Wert, der durch die maximale INT Größe repräsentiert ist:
    PHP-Code:
    echo decbin (PHP_INT_MAX) , '<br>'
    echo ~
    23'<br>';
    // 1111111111111111111111111111111
    // 11111111111111111111111111101000 

    Kommentar


    • #3
      wär ja auch doof wenn man für zahlen nur 1 byte zur verfügung hätte

      Kommentar


      • #4
        Hallo,

        kann dir leider noch nicht folgen. Ist die Rechnung von oben falsch? Wie komme ich dann auf -24? Auch wenn ich alle restliche Bits mit 1 oder 0 fülle, kommte ich nicht auf -24. Ich mache irgendwas falsch.

        Danke!

        Kommentar


        • #5
          Das genaue Verfahren kann ich nicht erklären, aber (siehe edit): Die Größe von INT ist auf den DEC Zahlwert 2147483647 beschränkt. Alles drüber wird durch einen overflow negativ (interessanterweise werden die overflows vom kleinsten = stellenwert längsten Wert Richtung Null wieder hochgezählt).
          Der repräsentierte theoretische INT Wert der obigen Negation ist DEC 4294967272, also wesentlich größer als der maximale Wert und führt zum Überlauf:
          PHP-Code:
          echo (int) (4294967272); // -24

          echo (int) (2147483647);     // 2147483647 (Maximum)
          echo (int) (2147483647 1); // -2147483648
          echo (int) (2147483647 2); // -2147483647 
          Das (int) Casting unterbindet die Verwendung des Float Typs

          Kommentar


          • #6
            jop du hat ein bit zu viel wenn du ~23 machst

            PHP-Code:
            echo decbin(2147483647)."<br>"// 1111111111111111111111111111111
            echo decbin(~23); // 11111111111111111111111111101000 -> eine Stelle mehr als Maximum 

            Kommentar


            • #7
              Hallo und danke für die Antwort. Vielleicht weiß jemand wie die binäre Umrechnung genau funktioniert, das würde mich interessieren.


              Kann es sein, dass die Negation einer Zahl immer um 1 größer ist als die tatsächliche Zahl, oder ist das nur Zufall? Also ~2354 = -2355, ~235445 = -235446

              Kommentar


              • #8
                Code:
                ~0(0) <=> -1(11111111111111111111111111111111)
                ~1(1) <=> -2(11111111111111111111111111111110)
                ~2(10) <=> -3(11111111111111111111111111111101)
                ~3(11) <=> -4(11111111111111111111111111111100)
                ~4(100) <=> -5(11111111111111111111111111111011)
                ~5(101) <=> -6(11111111111111111111111111111010)
                ~6(110) <=> -7(11111111111111111111111111111001)
                ~7(111) <=> -8(11111111111111111111111111111000)
                ~8(1000) <=> -9(11111111111111111111111111110111)
                ~9(1001) <=> -10(11111111111111111111111111110110)
                ~10(1010) <=> -11(11111111111111111111111111110101)
                ~11(1011) <=> -12(11111111111111111111111111110100)
                ~12(1100) <=> -13(11111111111111111111111111110011)
                ~13(1101) <=> -14(11111111111111111111111111110010)
                ~14(1110) <=> -15(11111111111111111111111111110001)
                ~15(1111) <=> -16(11111111111111111111111111110000)
                ~16(10000) <=> -17(11111111111111111111111111101111)
                ~17(10001) <=> -18(11111111111111111111111111101110)
                ~18(10010) <=> -19(11111111111111111111111111101101)
                ~19(10011) <=> -20(11111111111111111111111111101100)
                ~20(10100) <=> -21(11111111111111111111111111101011)
                ~21(10101) <=> -22(11111111111111111111111111101010)
                ~22(10110) <=> -23(11111111111111111111111111101001)
                ~23(10111) <=> -24(11111111111111111111111111101000)
                ~24(11000) <=> -25(11111111111111111111111111100111)
                ~25(11001) <=> -26(11111111111111111111111111100110)

                Kommentar


                • #9
                  Gut, kein Zufall.

                  Ich werde den Thread noch nicht als "erledigt" markieren, da mich eigentlich nur die binäre Umrechnung interessiert hat. Vielleicht hat sich jemand damit beschäftigt.

                  Danke!

                  Kommentar


                  • #10
                    Hängt alles mit dem Vorzeichenbit zusammen. Vgl: Arithmetischer Überlauf – Wikipedia

                    Ich werde den Thread noch nicht als "erledigt" markieren, da mich eigentlich nur die binäre Umrechnung interessiert hat. Vielleicht hat sich jemand damit beschäftigt.
                    Was genau willst Du denn noch wissen?

                    Kommentar


                    • #11
                      Ich wollte die binäre Rechnung sehen, wie man dort auf -24 kommt. Ist nicht sehr wichtig, würde mich aber interessieren.

                      Danke für den Tipp mit decbin(), sehr praktische Funktion.

                      Kommentar


                      • #12
                        irgendwo is dann auch ma schluss:

                        PHP-Code:
                        echo  ~2147483648//2147483647
                        echo  ~2147483649//2147483647
                        echo  ~2147483650//2147483647 

                        Kommentar


                        • #13
                          Zitat von 4yupix Beitrag anzeigen
                          Ich wollte die binäre Rechnung sehen, wie man dort auf -24 kommt. Ist nicht sehr wichtig, würde mich aber interessieren.

                          Danke für den Tipp mit decbin(), sehr praktische Funktion.
                          Nimm die erste 1 weg, dann einmal das ganze flippen, dann +1 und du hast die Zahl die hinters Minus muss

                          Kommentar


                          • #14
                            @cycap: Nö? Du mußt bloß bei INT bleiben, sonst werden übergroße INT in FLOAT konvertiert.
                            PHP-Code:
                            echo  (int) 2147483650
                            echo  
                            decbin ((int) 2147483650); 
                            @4yupix: Ist doch wunderbar erklärt in Deinem Link. Stichwort 2weierkomplement.

                            Kommentar


                            • #15
                              Ja, dachte ich auch. Bin aber auf andere Zahl gekommen. Ich werde mir lieber das morgen nochmal anschauen. Jetzt wird das wenig Sinn machen .

                              Kommentar

                              Lädt...
                              X