Вы можете использовать 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);