Bitwise Operator Not

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

  • Bitwise Operator Not

    Hallo,

    kann mir einer bitte folgenden Ergebnis erklären - wie sich diese ergeben?

    PHP-Code:
    $a 0;
    echo ~
    $a;    // -1

    echo "<br>";

    $a 3;
    echo ~
    $a;    // -4

    echo "<br>";

    $a 9;
    echo ~
    $a;    // -10

    echo "<br>";

    $a = -4;
    echo ~
    $a;    // 3 
    Mit den anderen Bitwise Operatoren kenne ich mich gut aus, nur den Schnall ich nicht.

    Ich hätte gedacht das beim ersten 255 und beim zweiten 252 usw. rauskommt.

    Vielen Dank schon mal.

  • #2
    Re: Bitwise Operator Not

    0 = 00000000b negiert ergibt 11111111b = -1
    3 = 00000011b negiert ergibt 11111100b = -4

    Code:
    +127(10) = 01111111(2) = 7F(16)
    +  4(10) = 00000100(2) = 04(16) 
    +  1(10) = 00000001(2) = 01(16)
       0(10) = 00000000(2) = 00(16)  
    -  1(10) = 11111111(2) = FF(16) 
    -  4(10) = 11111100(2) = FC(16) 
    -127(10) = 10000001(2) = 81(16)
    -128(10) = 10000000(2) = 80(16)
    Quelle: http://de.wikipedia.org/wiki/Zweierkomplement

    Kommentar


    • #3
      ok danke.

      woher weiß ich, ob diese bitfolge "11111011" jetzt eine -4 oder eine +251 ist???

      Kommentar


      • #4
        Original geschrieben von mchashi
        ok danke.

        woher weiß ich, ob diese bitfolge "11111011" jetzt eine -4 oder eine +251 ist???
        Wenn die erste Ziffer 1 ist, ist es negativ, wenn 0, dann positiv.

        Ein Integer hat, wenn wir jetzt von einem 32bit Betriebssystem mit 32bit CPU ausgehen, 32bit.

        251 wäre also binär 00000000 00000000 00000000 11111011.
        -4 wäre 11111111 11111111 11111111 11111011.
        Zuletzt geändert von h3ll; 14.11.2008, 21:39.

        Kommentar


        • #5
          PHP-Code:
          echo decbin(10); 
          Ergibt aber 1010 - so wie ich es mir denke. warum sagt du wenn vorne eine 1 steht, ist es immer negativ?

          PHP-Code:
          echo bindec(1010); 
          Ergibt +10. Keine Minuszahl.

          Irgendwas check ich noch nicht. Wann geht man bei php von einer negativen binärzahl aus und wann nicht...

          Kommentar


          • #6
            gut jetzt hast du oben dein beispiel geändert und ich glaub ich habs jetzt geschnallt. ich werde noch mal ein wenig rumrechnen.

            danke schon mal für deine nette hilfe...

            Kommentar


            • #7
              Also intern werden die Zahlen in 8Bit-Block interpretiert, d.h. die Zahl 10 passt noch in 8-Bit-Raster und deshalb auch mit 00001010 dargestellt. Du hast verkürzt geschrieben (4bits verschluckt ), deshalb sieht es für dich nicht klar. Sobald die Zahl das Raster gesprengt hat, wird 8-Bit zur Dartellung hinzu genommen, bis das Betriebsystem nein sagt (z.B. bei 32-Bit OS ist 32 Bit die Grenze), dann kommt zum overflow und die Zahl wird negiert dargestellt. Bei PHP ist das so, weil die Variablentyp nicht fest vor definiert ist. In anderen Hochsprachen musst du von vorne herein sagen wasfür Typ sie ist, und somit auch den Wertebereich festgelegt hast.

              z.B. du definierst a ist vom Typ Byte, also 8-bit und bei einer Berechnung kommt als Ergebnis 128 raus, dann bekommst du einen overflow als runtime error.
              Zuletzt geändert von asp2php; 14.11.2008, 22:04.

              Kommentar


              • #8
                -4 wäre 11111111 11111111 11111111 11111011.
                Das ist aber nicht richtig.

                Richtig ist: 11111111 11111111 11111111 11111100

                Du bringst mich ja ganz durcheinander

                Kommentar


                • #9
                  Sorry, aber du hast es selber gesagt, und ich habs aus Faulheit übernommen =)

                  woher weiß ich, ob diese bitfolge "11111011" jetzt eine -4 oder eine +251 ist???

                  Kommentar


                  • #10
                    Eine Frage hab ich noch.

                    Gehen wir von einem 32 Bit Integer aus.

                    Ich habe jetzt $a = 5;
                    Das ist = 00000000 00000000 00000000 00000101 (2)

                    $a = ~5;
                    Das ist = 11111111 11111111 11111111 11111010 (2)

                    Wie komme ich von der Binärzahl (~5) auf eine Dezimalzahl ???
                    Welche Rechenschritte sind von Hand nötig?

                    Kommentar


                    • #11
                      Wenn Zahl positiv (höchstwertige Bit ist 0) dann direkt ablesen, wenn Zahl negativ (höchstwertige Bit ist 1) dann einzelne Bit invertieren und 1 dazu addieren (oder richtigerweise: 1 subtrahieren und dann invertieren)

                      hier: 11111010

                      1. 00000101
                      2. 00000110

                      = -6
                      Zuletzt geändert von asp2php; 14.11.2008, 23:34.

                      Kommentar


                      • #12
                        vielen dank, jetzt hab ich es !

                        Kommentar

                        Lädt...
                        X