обратное проектирование битовых масок для получения списка разрешений


Я работаю с разрешениями, представленными битовыми масками. Эти разрешения являются

$permissionMap = [
    'VIEW'     => 1;
    'CREATE'   => 2;
    'EDIT'     => 4;
    'DELETE'   => 8
    'UNDELETE' => 16;         
    'OPERATOR' => 32;         
    'MASTER'   => 64;         
    'OWNER'    => 128;
];       

Если я объединю несколько разрешений, скажем VIEW ,EDIT, и DELETE, чтобы получить битовую маску 13. Можно ли перепроектировать это целое число, чтобы узнать, какие разрешения использовались для его создания?

function getPermissions($mask, $permissionMap) {
    // use $permissionMap to return string[] 
}

$viewEditAndDelete = 1 | 4 | 8; // 13

getPermissions($viewEditAndDelete, $permissionMap); // ['VIEW', 'EDIT', 'DELETE']
Author: David, 2014-05-02

1 answers

Просто проверьте, установлена ли определенная маска. На самом деле это довольно просто, если мы пройдемся по $map и проверим, установлен ли его флаг:

function getPermissions($mask, $permissionMap) {
    $permissions = [];
    foreach( $permissionMap as $perm => $val )
        if( $mask & $val )
            array_push( $permissions, $perm );
    return $permissions;
}
 2
Author: Sunny Patel, 2014-05-02 00:32:42