我有一个附加了值的数据列表,随着它的上升不断加倍:
0 = value 0
1 = value 1
2 = value 2
4 = value 3
8 = value 4
16 = value 5
32 = value 6
64 = value 7
128 = value 8
256 = value 9
512 = value 10
我也得到了数字x
说x = 76.
从视觉上看,我可以看到值7(64),值4(8)和值3(4)总计达到76.
我需要做的是,获取x,通过函数运行它,并返回值的数组。
我已经尝试反过来循环遍历所有数字并取消使用了什么值,但我对许多if语句感到困惑。
是否有内置的PHP函数来执行此操作?或者我是以错误的方式看待它?
谢谢
答案 0 :(得分:1)
可能你正在寻找这个 -
function getArray($x){
$ar = array();
for($i = 0 ; $i < 16; $i++){
if( ($x&(1<<$i)) != 0 ){
array_push($ar, (1<<$i));
// if you need positions; you should use it instead of above line
//array_push($ar, ($i+1));
}
}
return $ar;
}
print_r( getArray(76) );
输出:
Array (
[0] => 4
[1] => 8
[2] => 64
)
替代输出将是(如果您使用array_push($ar, ($i+1));
) -
Array
(
[0] => 3
[1] => 4
[2] => 7
)
<强>解释强>
二进制76
以16位呈现00000000 01001100
。我运行了从最低有效位(LSB)到最高有效位(MSB)(0-16)的循环。在每个循环中,我生成一个仅包含i'th
位为1
的新数字,其余位为0
。为了生成它,我使用了移位运算符(1 << i)
,实际上是2 ^ i。现在我在AND
和新号码之间进行了一些明智的x
操作。如果此操作返回任何非零数字,则表示i'th
的{{1}}位为1,并且我在该数组内推送该位置/值。最后,我回到了那里。