Bitwise Operator Not

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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

    Comment


    • #3
      ok danke.

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

      Comment


      • #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.
        Last edited by h3ll; 14-11-2008, 20:39.

        Comment


        • #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...

          Comment


          • #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...

            Comment


            • #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.
              Last edited by asp2php; 14-11-2008, 21:04.

              Comment


              • #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

                Comment


                • #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???

                  Comment


                  • #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?

                    Comment


                    • #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
                      Last edited by asp2php; 14-11-2008, 22:34.

                      Comment


                      • #12
                        vielen dank, jetzt hab ich es !

                        Comment

                        Working...
                        X