将按位/二进制数恢复为值数组?

时间:2017-03-01 19:18:18

标签: php

我有一个附加了值的数据列表,随着它的上升不断加倍:

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函数来执行此操作?或者我是以错误的方式看待它?

谢谢

1 个答案:

答案 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,并且我在该数组内推送该位置/值。最后,我回到了那里。