битовые манипуляции — показать двоичную строку в виде битов в переполнении стека

У меня есть этот код:

$a = pack('N',0b00111010000011110101011100100010);

$start = strlen($a)*8 -1;
$str = '';
for($k = $start; $k>=0; $k--) {
$bit = ($a >> $k) & 1;
$str .= $bit;
}

var_dump($str);

Вывод должен быть таким:

00111010000011110101011100100010

но покажи мне этот вывод:

00000000000000000000000000000000

что не так в этом коде ??

1

Решение

Есть опечатка.

$a = pack('N',0b00111010000011110101011100100010);
^
1

Другие решения

Я изменил код на это, и моя проблема решена:

$a = pack('N',0b00111010000011110101011100100010);

$str = '';
for($j=0;$j<strlen($a); $j++) {
$byte = substr($a, $j, 1);
$num = ord($byte);
for($k=7; $k>=0; $k--) {
$bit = ($num >> $k) & 1;
$str .= $bit;

}

}
var_dump($str);
0

Другой способ — сдвинуть бит, который вы читаете, вместо байта данных, тоже самое. Нет необходимости в substr () одного байта, работает индексная запись массива

$a = pack('N',0b00111010000011110101011100100010);
$str = '';
for ($i=0; $i<strlen($a); $i++) {
$byte = ord($a[$i]);
$mask = 0x80;
while ($mask > 0) {
$str .= ($byte & $mask) ? '1' : '0';
}
}

echo "$str\n";

Редактировать: исправлены опечатки, теперь работает

0