如何根据动态值移动二进制字符串-PHP

时间:2019-04-12 10:29:31

标签: php binary

我有一个0和1形式的二进制字符串336。我从变量获取值。假设字符串为010101010001111,变量值为3,那么我想要这样的字符串:111010101010001。

有可能吗?如何在PHP中完成?

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以尝试这样

$num = "010101010001111";
$shiftCount = 3;
$valueToReplace = 1;
echo substr(str_pad($num, strlen($num)+$shiftCount,$valueToReplace,STR_PAD_LEFT),0,-$shiftCount);

str_pad —用另一个字符串将字符串填充到一定长度
substr —返回字符串的一部分
strlen-获取字符串长度

  

pad_type

     

可选参数pad_type可以为 STR_PAD_RIGHT STR_PAD_LEFT 或    STR_PAD_BOTH 。如果未指定pad_type,则假定为    STR_PAD_RIGHT

Demo

答案 1 :(得分:0)

您必须在此处进行一些 bit 操作

$decVal = bindec($string); // 010101010001111 --> 10895

实时演示:https://3v4l.org/lSCLq

总体思路是这样的:

  1. 将二进制字符串转换为十进制值。

    $decVal
  2. $variable值右移$decVal >> $variable // 010101010001111 --> 000010101010001 个位置。

    $decVal
  3. strlen($string) - $variable值向左移动$decVal << (strlen($string) - $variable) // 010101010001111 --> 010101010001111000000000000 个位置

    AND
  4. ...0000000000111111111111111使用(($decVal << (strlen($string) - $variable)) & ~(~0 << strlen($string))) // 010101010001111000000000000 & ...0000000000111111111111111 --> ...0000000000111000000000000

    进行第3步的输出
    OR
  5. ($decVal >> $variable) | (($decVal << (strlen($string) - $variable)) & ~(($decVal | ~0) << strlen($string))) // 000010101010001 | ...0000000000111000000000000--> 111010101010001 步骤2和步骤4的输出以实现所需的结果

    $result = decbin(...);
    echo $result;
    
  6. 最后,以二进制字符串表示形式显示步骤5的输出。

    const PIC = document.querySelector('picture');
    const IMAGE = document.querySelector('img');
    
    var widths = [200,400,800], mW = [250,450,451]
    
    for (var i = 0; i < 3; i++) {
      var source = document.createElement('source'); //created Source element
      var media = '(max-width:'+mW[i]+'px)';
      source.setAttribute('media', media); //Set its media attribute 
      //created srcset attribute
      var imgSrc = IMAGE.getAttribute('src'); //Img src 
      // strip off last 8 chars of image name
      imgSrc = imgSrc.slice(0, -8);
      var srcset = imgSrc + '-' + widths[i] + '.jpg'; 
      source.setAttribute('srcset', srcset);
      var insert = PIC.insertBefore(source, PIC.firstChild);
    }
    console.log(PIC.outerHTML)