Как правильно аннулировать разрешение при использовании побитовых разрешений?

Хорошо, вот суть того, что я планирую сделать.

У меня будет два стола. Один с «рангами» или «ролями» и один с пользователями. Я хочу назначать разрешения на основе роли/пользователя и отзывать разрешения на основе пользователя.

Итак, просто для общих целей допустим, что у нас есть $role_can $user_can и $user_cant

Я знаю, что для указания каких целей мы можем использовать побитовое ИЛИ. $permissions = ($role_can | $user_can), и это объединит их.

Теперь я хочу иметь возможность отозвать определенные разрешения после этого. ОБЫЧНО это делается с помощью побитового XOR, но я хочу сделать его защищенным от идиотов. Другими словами, я не хочу случайно предоставить им доступ к разрешению, исключив разрешение, которым они еще не владеют.

Как лучше всего это сделать?

Традиционно (($role_can | $user_can) ^ $user_cant) - но это не сработает для защиты от идиотов.

Я все еще новичок в битовых операциях, так что полегче со мной, если ответ очевиден.

Я использую PHP, но приемлемый ответ может быть на любом языке/псевдокоде, если он работает и его легко понять.

Спасибо.


person Navarr    schedule 08.07.2010    source источник


Ответы (1)


Вы можете использовать побитовый оператор "не".

(($role_can | $user_can) & ~$user_cant)
person Dean Harding    schedule 08.07.2010
comment
И НЕ. Спасибо. Я пробовал всевозможные комбинации и не мог мысленно понять это. Раньше я думал, что NOT не будет работать, потому что, ну, все остальное было бы неправильно, но я вижу, как это работает в сочетании с AND. Спасибо. - person Navarr; 08.07.2010