Как я могу установить несколько определенных битов целого числа для конкретных значений? - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь выполнить некоторую работу с разрешениями, хранящимися в целых числах, используя побитовые операторы, и застрял, пытаясь установить несколько определенных битов в 1 или 0 в одной строке.

Мой текущий код:

function setPermission(int $permissions, int $type, bool $value)
{
    return ($permissions & ~$type) | /* There is what i don't know how to do */;
}

echo setPermission(2|4|16, 4|8,    false); // 2|16
echo setPermission(2|4|16, 4|8,    true ); // 2|4|8|16
echo setPermission(1|2|4,  4|8|16, false); // 1|2

Анализируя проблему, я выясняю, как выполнить первую часть функции и что вторая должна быть равна $ type, когда $value равно true и 0 когда $value равно false, но я не знаю, как это сделать проще всего.

Обращаю ваше внимание, что параметр $type может быть любым целым числом, а не только степеньюдва.

1 Ответ

0 голосов
/ 30 декабря 2018

Вам необходимо выполнить другую операцию в setPermission в зависимости от того, является ли $value истинным или ложным.Ваш текущий код реализует только тот случай, когда вы хотите очистить разрешения ($value = false).

function setPermission(int $permissions, int $type, bool $value)
{
    if ($value)
        return $permissions | $type;
    else
        return $permissions & ~$type;
}

Демонстрация на 3v4l.org

...