Suche LOGISCHEN bitwise operator!

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

  • Suche LOGISCHEN bitwise operator!

    Guten Tag an alle,

    folgendes Problem... Ich habe folgenden Befehl/Ausdruck:

    PHP-Code:
    <?php
    3084996963 
    >> 29;
    ?>
    So, leider versteht PHP unter dem >>-Operator ein "arithmetic shift", was ich suche ist allerdings ein "locigal shift".

    Hier das was PHP macht:
    PHP erkennt das erste bit als ein Vorzeichen an und verschiebt alle bits DANACH um 29 Stellen.
    Code:
    10110111111000010101000101100011 (Ausgangszahl - Binär)
    1              0110111111000010101000101100011
    ^ Vorzeichen   ^ Zahl
    Jetzt vollzieht PHP die Verschiebung..
    Das Ergebnis ist '11' mit dem Vorzeichen '1' also -3!

    Was ich will:
    Code:
    10110111111000010101000101100011
    
    Nach Verschiebung:
    00000000000000000000000000001011
    Der Ergebnis ist also '1011' mit dem Vorzeichen '0' also 5!

    Danke im voraus!

    // Edit: Ich merke grade, dass es daran zu liegen scheint das PHP nicht mehr als 32 bits verträgt... Gibt es da eine möglichkeit das zu umgehen?
    Zuletzt geändert von Schanz; 24.01.2008, 14:31.

  • #2
    Was als Int nicht geht, macht man einfach als String *zucks*
    PHP-Code:
    <?php

    echo decbin(3084996963) . "\n";
    echo 
    str_repeat("0"28) . substr(decbin(3084996963), 04);
    Code:
    X-Powered-By: PHP/5.2.0
    Content-type: text/html
    
    10110111111000010101000101100011
    00000000000000000000000000001011

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Warum verschiebst du nicht um einen Wert der das Problem umgeht? PHP kennt nur diesen Bitoperator
      Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

      Kommentar


      • #4
        Wenn ich das folgende Script
        PHP-Code:
        $z1 3084996963;
        $z2 $z1 >> 29;

        echo 
        decbin($z1) . "<br />";
        echo 
        decbin($z2) . "<br />";
        echo 
        $z1 "<br />";
        echo 
        $z2 "<br />";
        echo 
        floor($z1 pow(229)) . "<br />"
        ausführe, erhalte ich unter Linux (CentOs 5) das folgende Resultat:
        Code:
        10110111111000010101000101100011
        101
        3084996963
        5
        5
        , also das was du haben möchtest. Spasseshalber hab ich das Ganze noch auf meinem Windoof-Laptop getestet, und siehe da:
        Code:
        10110111111000010101000101100011
        11111111111111111111111111111101
        3084996963
        -3
        5
        . Das ist offensichtlich das Verhalten deines Servers. Wenn du das umgehen willst, musst du die Division mit der Zweierpotenz nehmen, die funktioniert an beiden Orten

        EDIT:

        Eben fällt mir ein, dass das wahrscheinlich gar nicht am Betriebssystem liegt, sondern daran, dass es sich bei der Linux-Kiste um eine 64-Bit Maschine handelt

        Zuletzt geändert von H2O; 24.01.2008, 15:22.
        Gruss
        H2O

        Kommentar


        • #5
          >.>
          Vorher lesen was man postet...

          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
          Wie man Fragen richtig stellt

          Kommentar


          • #6
            Dankeschön euch beiden (ghostgambler und H2O), ich werde wohl die Potenzmethode nehmen.

            Kommentar


            • #7
              So sorry für Doppelpost, aber bei einem edit guckt ihr vieleicht nicht mehr hin.

              @ H2O:
              Der Befehl
              floor($z1 / pow(2, 3)) ist ja equivalent zu $z1 >> 3;

              Hättest du auch einen für $z1 << 3; parrat?

              (Also quasi die ersten 3 binären Ziffern abschneiden)
              Zuletzt geändert von Schanz; 24.01.2008, 16:37.

              Kommentar


              • #8
                Multiplikation statt der Division?

                Kommentar


                • #9
                  Original geschrieben von PHP-Desaster
                  Multiplikation statt der Division?
                  Aber sicher
                  Handbuch-Vorlese-Service:
                  $a << $b Nach links verschieben. Verschiebung der Bits von $a um $b Stellen nach links (jede Stelle entspricht einer Mulitplikation mit zwei).
                  $a >> $b Nach rechts verschieben. Verschiebt die Bits von $a um $b Stellen nach rechts (jede Stelle entspricht einer Division durch zwei).
                  Gruss
                  H2O

                  Kommentar


                  • #10
                    Aber sicher
                    Sag ich ja

                    Kommentar


                    • #11
                      Ehmm ja das hab ich auch bereits probiert, allerdings wird die Zahl (binär gesehen) um 3 Stellen erweitert:

                      Code:
                      ERGEBNIS-SOLL:
                      10110111111000010101000101100011	(3084996963 - Vor dem Befehl)
                      10111111000010101000101100011000	(3205139224 - Nach dem Befehl)
                      
                      C#.NET Befehl: z1 = (3084996963) << 3;
                      
                      ERGEBNIS-IST:
                      10110111111000010101000101100011	(3084996963)
                      10110111111000010101000101100011000	(24679975704 - Nach dem Befehl)
                      
                      PHP Befehl: $z1 = floor(3084996963 * pow(2, 3));

                      Kommentar


                      • #12
                        Liegt daran, dass PHP aus einem Int automatisch ein Float macht, wenn der Wertebereich zu klein wird. Vielleicht hilft ein Cast

                        Edit: Jepp. Folgender Code:
                        PHP-Code:
                        $s 3084996963;
                        $t $s pow2);
                        var_dump$tintval$t ), decbinintval$t ) ) ); 
                        ergibt die Ausgabe:
                        Code:
                        float(24679975704)
                        int(-1089828072)
                        string(32) "10111111000010101000101100011000
                        Edit2: << gibt dir direkt ein Integer und das richtige Ergebnis!
                        Zuletzt geändert von PHP-Desaster; 25.01.2008, 13:35.

                        Kommentar


                        • #13
                          Hmmm ja stimmt darauf hätte ich auch kommen können "<<" unterstüzt ja nur 32 bit und das ist ja genau das was ich in diesem Fall will xD

                          Vielen Dank für die Hilfe =)

                          Kommentar

                          Lädt...
                          X