如何连接 PHP 中几个字节的位

How to concatenate bits of several bytes in PHP

我在php.net和这里的自学至今没有找到任何方法!我对 &>><< 等运算符的实验我不想在这里展示 - 太尴尬了!

起点是具有整数值(始终为 8 位)的不同长度的数组。

例如:

[178, 89, 1]

他们的二进制编码等价物...

10110010, 01011001, 00000001 

应该是,最低有效位在前,...

01001101, 10011010, 10000000

串联:

010011011001101010000000

谁能一步步给我解释一下过程,让我明白php中的位操作

谢谢

Post 剧本: 我不想用字符串操作来解决问题(我可以这样做 - 但它非常慢!),而是用位操作。

<?php
function dec2bin_i($decimal_i)
{
 bcscale(0);

 $binary_i = '';
 do
  {
   $binary_i = bcmod($decimal_i,'2') . $binary_i;
   $decimal_i = bcdiv($decimal_i,'2');
  } while (bccomp($decimal_i,'0'));

 return($binary_i);
}
//empty output string
$output = '';
//define array
$array = [178, 89, 1];
//loop array values
foreach($array as $value){
    //convert to binary and concatenate
    $output .= dec2bin_i($value);
}
//show output
echo $output;
?>

使用,decbin()但是你需要0向左填充,否则00000001会再次变成1

一种方法是使用 array_reduce(),尽管您可以通过多种方式遍历数组。

<?php
$array = [178, 89, 1];

echo array_reduce($array, function ($acc, $byte) {
   return $acc.strrev(str_pad(decbin($byte), 8, 0, STR_PAD_LEFT));
})

结果:010011011001101010000000

https://3v4l.org/D4qGr

可能您需要这样的东西:

<?php
$array = [178, 89, 1];

$output = 0;
foreach ($array as $v) {
    for ($i = 0; $i < 8; $i++) {
        $output = ($output << 1) | ($v & 1);
        $v = $v >> 1;
    }
}

echo $output . " " . str_pad(decbin($output), 24, 0, STR_PAD_LEFT);

现在一步步来:

  1. 对于输入数组中的每个元素,我们得到第 0 位(不太重要)- $v & 1
  2. 输出变量左移,为这个位提供space$output << 1
  3. 位被设置到输出变量中最右边的位置|部分
  4. 我们将变量右移,所以第 1 位变为第 0
  5. 其余重复