在php中以位的形式显示二进制字符串

在php中以位的形式显示二进制字符串,php,bit-manipulation,Php,Bit Manipulation,我有以下代码: $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

我有以下代码:

$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
这段代码有什么问题?

有一个输入错误

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

我将代码更改为此,我的问题得到了解决:

$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);
$a=pack('N',0B0011010100000110101011100100010);
$str='';
对于($j=0;$j=0;$k--){
$bit=($num>>$k)&1;
$str.=$bit;
}
}
var_dump($str);

另一种方法是移动正在读取的位,而不是数据字节,事实上也是如此。不需要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";
$a=pack('N',0B0011010100000110101011100100010);
$str='';
对于($i=0;$i 0){
$str.=($byte&$mask)?'1':'0';
}
}
回显“$str\n”;

编辑:修复了打字错误,现在运行

您的代码执行时间很长。在我的浏览器中,它的时间是无限的,最终以溢出内存大小结束!!但我的解决方案的执行时间大约是1秒。哎呀,有两个bug。现在试试。不知道为什么它不会退出,但是,在我的系统上,它立即出错了。