• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage Bit-Invertierung einer Ganzzahl

G

Gelöschtes Mitglied 35303

Guest
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:
<?php

$zahl = 0b010;
$zahl = ~$zahl;

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:
Code:
<?php
 
$zahl = 0b010; // entspricht 2; siehe http://php.net/manual/de/language.types.integer.php -> Syntax -> binary
 
Werbung:
Vielleicht so:
PHP:
$val = 0b101;
$nrdigits = ceil(log($val, 2));
$mask = pow(2, $nrdigits) - 1;
$invertedval = ~$val & $mask;
echo decbin($invertedval);
echo '<br>';
$valstr = "0b010";
$val = bindec($valstr);
$nrdigits = strlen($valstr) - 2;
$mask = pow(2, $nrdigits) - 1;
$invertedval = ~$val & $mask;
$format = '%0' . $nrdigits . 'b';
printf ($format, $invertedval);
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.

Wäre es stattdessen nicht einfacher, die Indices von decbin() durchzugehen und entsprechend zu ersetzen?
 
Dass man den String, den decbin() zurückgibt, in einzelne Zeichen trennt und diese dann per foreach auf das jeweilige Gegenteil setzt.
 
Werbung:
Zurück
Oben