Bitweise Operationen mit longint

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

  • Bitweise Operationen mit longint

    Hallo zusammen.

    Seit der Umstellung von php 4.3.10 auf 4.4.4 habe ich ein Problem mit einem Script, dass bitweise Operationen auf lange Ganzzahlen ausführt.

    Debuginfo php 4.3.10

    a -> [11100101100011010011000101011111] <0xe58d315f> -443731617 ( [COLOR=red] -4738698913 [/COLOR] )
    h -> [00000000000000001010101100100110] <0x0000ab26> 43814 ( 43814)

    a xor h
    a -> [11100101100011011001101001111001] <0xe58d9a79> -443704711 ( 3851262585)



    Debuginfo php 4.4.4

    a -> [10000000000000000000000000000000] <0x80000000> -2147483648 ( [COLOR=red] -4738698913[/COLOR] )
    h -> [00000000000000001010101100100110] <0x0000ab26> 43814 ( 43814)

    a xor h

    a -> [10000000000000001010101100100110] <0x8000ab26> -2147439834 ( 2147527462)



    Ausgabeinformationen sind die Variablen in verschiedenen Zahlensystemen, sowie der Zahlwert als Float ohne Nachkommastellen (in Klammern).

    Das problem hierbei ist, dass php bei einem integer overflow den Wert intern als float ablegt was bisher jedoch kein thema war, weil die Bitweise darstellung bisher trotzdem korrekt war.

    Seit 4.4.4 ist der Hex Wert jedoch 0x80000000 was eine Bitweise operation fehlerhaft macht.

    Ich habe bisher alle Tricks, die mir so eingefallen sind um an den Binär korrekten Wert zu gelangen, ausprobiert und war, offensichtlich, erfolglos.

    Typeconversion zu Float hat nicht geholfen, die GMP Lib gibt es für die aktuelle PHP version noch nicht.

    Hat jemand eventuell eine Idee, wie ich an den korekten Binärwert gelangen kann?

  • #2
    hmm ... hast du es schon mal mit den bcmath-Funktionen versucht
    (die sollten auch große Werte richtig berechnen)? (-> dannach in Binär konvertieren)

    MFG
    BLG
    Zuletzt geändert von BLG; 23.10.2006, 15:39.

    Kommentar


    • #3
      code her, code her oder ich fall um!
      blllubb

      Kommentar


      • #4
        Der Code ist recht unspektakulär:

        PHP-Code:
        header("content-type:text/plain");
        function 
        varVal($var,$name=""){
            
        printf("%15s -> [%032b] <0x%08x> %12d (%12.0f)\n",$name,$var,$var,$var,$var); 
        }

        $a = -443731617;
        $h 43814;

        varVal($a,"a");
        varVal($h,"h");

        $a ^= $h;

        varVal($a,"a"); 
        Resultat sieht man im Eröffnungspost.
        Wie gesagt, das Problem liegt darin, dass der Wert in $a zu groß für signed Int ist und daher intern als float behandelt wird.
        In 4.3.10 wurde jedoch die Bitweise Operation korrekt ausgeführt.
        seit 4.4.4 bekomme ich bei übergroßen Integer Werten 0x80000000
        das führt natürlich zu Fehlerhaften Ergebnissen.

        bcmath hilft hier leider nicht, da es bitweise Operationen nicht unterstützt.

        /edith sagt:

        Laut der Bugmeldungen

        http://bugs.php.net/bug.php?id=11725
        http://bugs.php.net/bug.php?id=7755

        scheint sich da in näherer Zukunft nichts weiter zu tun und ausser der gmp funktionen auch kein workaround zu geben.

        Thema hat sich also erledigt.
        Zuletzt geändert von ankh; 24.10.2006, 14:01.

        Kommentar

        Lädt...
        X