Как сдвинуть двоичную строку на основе динамического значения - PHP - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть двоичная строка 336 в форме 0 и 1.Я получаю значение из переменной.Скажем, строка 010101010001111 и значение переменной 3, тогда я хочу такую ​​строку: 111010101010001.

Возможно ли это?Как это можно сделать в PHP?

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Здесь вы должны выполнить немного бит манипуляций,

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

Live Demo: 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 выход шага № 3 с ...0000000000111111111111111

    (($decVal << (strlen($string) - $variable)) & ~(~0 << strlen($string))) // 010101010001111000000000000 & ...0000000000111111111111111 --> ...0000000000111000000000000
    
  5. OR выходные данные шага № 2 и шага № 4 для достижения желаемого результата

    ($decVal >> $variable) | (($decVal << (strlen($string) - $variable)) & ~(($decVal | ~0) << strlen($string))) // 000010101010001 | ...0000000000111000000000000--> 111010101010001
    
  6. Наконец, отобразите вывод шага № 5 в двоичном строковом представлении.

    $result = decbin(...);
    echo $result;
    
0 голосов
/ 12 апреля 2019

Вы можете попробовать вот так,

$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 .

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...