1. Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!
    Information ausblenden

Frage Bit-Invertierung einer Ganzzahl

Dieses Thema im Forum "PHP" wurde erstellt von outsideHTML, 12 April 2018.

Tags:
  1. outsideHTML

    outsideHTML Mitglied

    Registriert seit:
    3 Oktober 2015
    Beiträge:
    46
    Punkte für Erfolge:
    6
    Hallo, ich möchte eine Ganzzahl bitweise invertieren; "010" soll also "101" ergeben. Dies funktioniert jedoch nicht so ganz, wie ich mir das vorstelle:
    PHP:
    1. <?php
    2.  
    3. $zahl = 0b010;
    4. $zahl = ~$zahl;
    5.  
    6. echo "{$zahl}: " . decbin($zahl) . PHP_EOL;
    https://3v4l.org/enf3V

    Stattdessen liefert der Aufruf von decbin() "1111111111111111111111111111111111111111111111111111111111111101" anstatt der erwarteten Zeichenkette "101".

    Wie lässt sich das ändern?
     
    Werbung:

    Jetzt registrieren, damit diese Werbung verschwindet
  2. djheke

    djheke Aktives Mitglied

    Registriert seit:
    8 Februar 2012
    Beiträge:
    905
    Punkte für Erfolge:
    28
    Wo ist der Dezimalwert?
     
  3. outsideHTML

    outsideHTML Mitglied

    Registriert seit:
    3 Oktober 2015
    Beiträge:
    46
    Punkte für Erfolge:
    6
    Code (text):
    1. <?php
    2.  
    3. $zahl = 0b010; // entspricht 2; siehe http://php.net/manual/de/language.types.integer.php -> Syntax -> binary
     
  4. m.scatello

    m.scatello Aktives Mitglied

    Registriert seit:
    15 Februar 2017
    Beiträge:
    738
    Punkte für Erfolge:
    28
  5. Sempervivum

    Sempervivum Senior HTML'ler

    Registriert seit:
    18 Oktober 2016
    Beiträge:
    1.022
    Punkte für Erfolge:
    63
    Vielleicht so:
    PHP:
    1. $val = 0b101;
    2. $nrdigits = ceil(log($val, 2));
    3. $mask = pow(2, $nrdigits) - 1;
    4. $invertedval = ~$val & $mask;
    5. echo decbin($invertedval);
    6. echo '<br>';
    7. $valstr = "0b010";
    8. $val = bindec($valstr);
    9. $nrdigits = strlen($valstr) - 2;
    10. $mask = pow(2, $nrdigits) - 1;
    11. $invertedval = ~$val & $mask;
    12. $format = '%0' . $nrdigits . 'b';
    13. printf ($format, $invertedval);
    14.  
    Bei der ersten Variante gehen führende Nullen verloren, sowohl beim Ausgangswert als auch beim Ergebnis. Bei der zweiten nicht, aber die Zahl muss als String definiert werden. In dem Fall könnte man auch die einzelnen Stellen durchgehen und aus einer "0" eine "1" machen und umgekehrt.
     
    Zuletzt bearbeitet: 12 April 2018
  6. outsideHTML

    outsideHTML Mitglied

    Registriert seit:
    3 Oktober 2015
    Beiträge:
    46
    Punkte für Erfolge:
    6
    Wäre es stattdessen nicht einfacher, die Indices von decbin() durchzugehen und entsprechend zu ersetzen?
     
  7. Sempervivum

    Sempervivum Senior HTML'ler

    Registriert seit:
    18 Oktober 2016
    Beiträge:
    1.022
    Punkte für Erfolge:
    63
    Verstehe nicht ganz, wie Du das meinst?
     
  8. outsideHTML

    outsideHTML Mitglied

    Registriert seit:
    3 Oktober 2015
    Beiträge:
    46
    Punkte für Erfolge:
    6
    Dass man den String, den decbin() zurückgibt, in einzelne Zeichen trennt und diese dann per foreach auf das jeweilige Gegenteil setzt.
     
  9. Sempervivum

    Sempervivum Senior HTML'ler

    Registriert seit:
    18 Oktober 2016
    Beiträge:
    1.022
    Punkte für Erfolge:
    63
    Ach so, das selbe hatte ich auch gemeint:
    Ist durchaus ein Alternative.