Как перевести 15 на 1,2,4,8 в php - PullRequest
0 голосов
/ 24 июня 2018

Точно так же:

1 = 1
2 = 2
3 = 1,2
5 = 1,4
6 = 2,4
7 = 1,2,4
9 = 1,8
15 = 1,2,4,8
31 = 1,2,4,8,16

Кажется, нужна какая-то двоичная функция.

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Вы можете использовать decbin для создания двоичного числа, а затем использовать массив для поиска того, какое это двоичное число.
Я использую array_intersect, чтобы найти «истинные» значения, и использую array_intersect_key, чтобы сопоставить их в $ arr. Это решение без петель, которое может быть или не быть быстрее.

$arr= [16,8,4,2,1];
$number = 13;
$bin = str_split(str_pad(decbin($number),count($arr),"0",STR_PAD_LEFT));

Echo implode(",", array_intersect_key($arr,array_intersect($bin, ["1"])));

https://3v4l.org/t9QQc

Если порядок важен, вам необходимо отсортировать его перед выводом.

$nums = array_intersect_key($arr,array_intersect($bin, ["1"]));
sort($nums);
Echo implode(",", $nums);
0 голосов
/ 24 июня 2018

Нашел это!

function split($n) {
    $n |= 0;
    $pad = 0;
    $arr = array();
    while ($n) {
        if ($n & 1) array_push($arr, 1 << $pad);
        $pad++;
        $n >>= 1;
    }
    return $arr;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...