Я в настоящее время читаю статью, но я действительно не понимаю как эта работа с логическим оператором. Кто-либо может объяснить это мне?
например, Если я хочу иметь 4 ценных бумаги уровня с клиентом, сотрудником, супервизором и Администратором.
[Serializable]
[Flags]
public enum WebRoles
{
customer= 1 << 0,
employee= 1 << 1,
supervisor = 1 << 2,
Admin = 2 << 3
}
и затем как я должен реализовать следующую логику.
if (Roles != 0 && ((Roles & role) != role))
return false;
Кто-либо может предоставить мне некоторое знание этой реализации?
Большое спасибо.
Daoming
В данном примере используется оператор битового сдвига: "<<". Этот оператор берёт биты и сдвигает их. Например, "1 << 3" приводит к цифре 8. Таким образом, в двоичном варианте
customer = 0001
employee = 0010
supervisor = 0100
admin = 1000 (I think this was supposed to read 1 << 3)
Теперь можно назначить людям несколько ролей с помощью битового оператора или оператора bitwise-. Это будет одна вертикальная панель "|". Битовым или комбинированным образом два числа бит за битом, устанавливая каждый бит, который устанавливается в любом из двух операндов.
myRole = customer | employee = 0011
Если-выставленное вами значение предназначено для того, чтобы сказать, есть ли у кого-то определенная роль. Она использует битовую и: "&". Bitwise-и объединяет эти два числа, устанавливая бит только в том случае, если бит установлен в обоих операндов.
Они используют enum
в качестве карты битов: если задан конкретный бит, значит, у вас есть эта привилегия. Они также используют оператор сдвига влево. Позвольте мне попробовать продемонстрировать все это сразу:
Role Decimal Binary Shifted Decimal -------- ------- ------ ------- ------- Customer = 1 = 000001 = 000001 = 1 Employee = 1 = 000001 = 000010 = 2 Supervisor = 1 = 000001 = 000100 = 4 Admin = 2 = 000010 = 010000 = 16
Таким образом, вы можете комбинировать две роли. Например, какой-нибудь пользователь может одновременно играть Employee
и Supervisor
, просто установив соответствующие биты.
И как проверить, установлен ли бит? Это именно то, что делает (Roles & role) != role)
. Например:
WebRoles user = WebRoles.Employee | WebRoles.Supervisor;
bool isEmployee = (user & WebRoles.Employee) == WebRoles.Employee; // true
Если проверить пользовательскую переменную, установлен ли бит Employee
, то оператор &
вернет все совпадающие биты.
Надеюсь на эту помощь; не стесняйтесь редактировать этот ответ
.