【发布时间】:2018-12-03 01:06:35
【问题描述】:
就像这样:
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
似乎需要一些二进制函数。
【问题讨论】:
-
非常简单的解决方案!每个数字都有所有设置位
-
到目前为止你做了什么?
就像这样:
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
似乎需要一些二进制函数。
【问题讨论】:
找到这个!
function split($n) {
$n |= 0;
$pad = 0;
$arr = array();
while ($n) {
if ($n & 1) array_push($arr, 1 << $pad);
$pad++;
$n >>= 1;
}
return $arr;
}
【讨论】:
您可以使用 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"])));
如果顺序很重要,那么您需要在输出之前对其进行排序。
$nums = array_intersect_key($arr,array_intersect($bin, ["1"]));
sort($nums);
Echo implode(",", $nums);
【讨论】: