【问题标题】:How to shift binary string based on the dynamic value - PHP如何根据动态值移动二进制字符串 - PHP
【发布时间】:2019-09-03 02:24:30
【问题描述】:

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 改进的语法和格式。
  • 不清楚你在问什么。二进制字符串和变量背后的连接/逻辑是什么?

标签: php binary


【解决方案1】:

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

$string = '010101010001111';
$decVal = bindec($string);
$variable = 3;
$result = decbin(($decVal >> $variable) | (($decVal << (strlen($string) - $variable)) & ~(~0 << strlen($string))));
echo $result;

现场演示:https://3v4l.org/lSCLq

整体思路是这样的:

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

    $decVal = bindec($string); // 010101010001111 --> 10895
    
  2. $decVal 值右移$variable 位置。

    $decVal >> $variable  // 010101010001111 --> 000010101010001
    
  3. $decVal 值左移strlen($string) - $variable 位置

    $decVal << (strlen($string) - $variable) // 010101010001111 --> 010101010001111000000000000
    
  4. AND...0000000000111111111111111 的第 3 步的输出

    (($decVal << (strlen($string) - $variable)) & ~(~0 << strlen($string))) // 010101010001111000000000000 & ...0000000000111111111111111 --> ...0000000000111000000000000
    
  5. ORstep#2和step#4的输出达到想要的结果

    ($decVal >> $variable) | (($decVal << (strlen($string) - $variable)) & ~(($decVal | ~0) << strlen($string))) // 000010101010001 | ...0000000000111000000000000--> 111010101010001
    
  6. 最后,以二进制字符串表示形式显示第 5 步的输出。

    $result = decbin(...);
    echo $result;
    

【讨论】:

  • 感谢包。你能解释一下第 4 步中的 ~(($decVal | ~0)
  • @HarisKhan,让我在这里解释一下,但在此之前 - 我想指出我已将 ~(($decVal | ~0) &lt;&lt; strlen($string)) 更改为 ~(~0 &lt;&lt; strlen($string)),因为这里不需要 $decVal。跨度>
  • @HarisKhan,现在解释一下;当您执行~0 时,您将得到所有1s 即11111111....,因此~0 &lt;&lt; strlen($string) 将给您...1111111000000000000000,而整个表达式的否定即~(~0 &lt;&lt; strlen($string)) 将是...00000000111111111111111。最后,在($decVal &lt;&lt; (strlen($string) - $variable))~(~0 &lt;&lt; strlen($string)) 的步骤#4 中AND 将为您提供...000111000000000000。当使用步骤#2 的输出获得ORed 时,此值会给出所需的结果。我希望你现在明白了。
【解决方案2】:

你可以这样试试,

$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_RIGHTSTR_PAD_LEFTSTR_PAD_BOTH。如果未指定 pad_type,则假定为 STR_PAD_RIGHT

Demo

【讨论】:

    猜你喜欢
    • 2022-07-20
    • 2020-04-09
    • 1970-01-01
    • 2012-09-10
    • 2013-07-07
    • 2022-11-01
    • 2016-01-15
    • 1970-01-01
    • 2020-11-02
    相关资源
    最近更新 更多