php - Битовая маска "декодировать" - PullRequest
0 голосов
/ 25 июня 2019

Я хотел бы написать функцию для «декодирования» битовой маски в исходные значения, например,
У нас есть номер и текст, прикрепленный к нему:

  • 2 - Text_1
  • 4 - Text_2
  • 8 - Text_3
  • 16 - Text_4
  • 32 - Text_5

Теперь я ввожу номер, например 48 (32 + 16) и я должен получить Text_5 и Text_4, поэтому он должен вернуть два числа: 32 и 16.
Как это получить?

Ответы [ 3 ]

2 голосов
/ 25 июня 2019

PHP имеет некоторые функции, чтобы помочь с этим, в первую очередь decbin() (https://www.php.net/manual/en/function.decbin.php), который преобразует целое число в двоичное. Затем вы можете разбить это на массив, который будет пронумерован значениями Text_ из вашего примера.

$input = 48;
$output = array_reverse(str_split(decbin($input)));

foreach ($output as $k => $v) {
    echo $v ? "Text_$k".PHP_EOL : "";
}

Таким образом, decbin(48) даст 110000, который можно разбить на следующий массив с помощью str_split():

Array
(
    [0] => 1
    [1] => 1
    [2] => 0
    [3] => 0
    [4] => 0
    [5] => 0
)

Но вы можете видеть, что это в обратном порядке - в двоичном коде мы нумеруем биты справа налево, а не слева направо. Так что вам нужно повернуть его, используя array_reverse().

Тогда у вас есть хороший массив Text_ => active (1 or 0) пар:

Array
(
    [0] => 0
    [1] => 0
    [2] => 0
    [3] => 0
    [4] => 1
    [5] => 1
)
1 голос
/ 25 июня 2019

Полагаю, это самая простая и "родная" реализация:

$array = [2 => 'Text_1', 4 => 'Text_2', 8 => 'Text_3', 16 => 'Text_4', 32 => 'Text_5'];

$number = 48;

foreach ($array as $mask => $string)
{
    if ($number & $mask)
    {
        echo "$mask: $string" . PHP_EOL;
    }
}
0 голосов
/ 25 июня 2019

Другая опция, использующая только битовые операторы ...

unmaskMe(48);

function unmaskMe(int $bitset) {
    $bitOfsset = 0;

    while ($bitset) {
        if ($bitset & (1 << $bitOfsset)) {
            echo 'Text_' .  $bitOfsset . PHP_EOL;

            $bitset &= ~(1 << $bitOfsset);
        }

        $bitOfsset++;
    }
}

Выходы:

text_4

Text_5

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