Frage Bit-Invertierung einer Ganzzahl

  • Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!
3 Oktober 2015
46
0
6
26
#1
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?
 

Sempervivum

Senior HTML'ler
18 Oktober 2016
1.177
252
83
65
#5
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.
 
Zuletzt bearbeitet:
3 Oktober 2015
46
0
6
26
#6
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?
 
3 Oktober 2015
46
0
6
26
#8
Dass man den String, den decbin() zurückgibt, in einzelne Zeichen trennt und diese dann per foreach auf das jeweilige Gegenteil setzt.