Работать с двоичными числами из JavaScript не очень-то удобно. Хорошо уже то, что можно получить двоичное представление числа через n.toString(2) и преобразовать двоичную строку в число через parseInt(..., 2).
Например:
| var access = parseInt("11000", 2); // 24 в 10-ной системе
|
|
|
| var access2 = access.toString(2);
|
|
|
| alert(access2); // 11000, в виде строки
|
…Поэтому обычно нужные доступы задаются в виде констант:
| var ACCESS_ADMIN = 1; // 00001
|
| var ACCESS_GOODS_CHANGE = 2; // 00010
|
| var ACCESS_GOODS_VIEW = 4; // 00100
|
| var ACCESS_ARTICLE_CHANGE = 8; // 01000
|
| var ACCESS_ARTICLE_VIEW = 16; // 10000
|
Чтобы получить маску, задающую определённые доступы, нужно составить число с 1 на нужной битовой позиции.
Это может сделать оператор ИЛИ (|) . Как мы помним, он ставит 1 в результате, если хотя бы у одного операнда на этой позиции 1. Поэтому если сделать ИЛИ любого числа с какой-либо из переменных ACCESS_* выше, то число останется неизменным там, где в ACCESS_* стоит 0, а там где 1 — станет 1. В результате будет добавлен доступ.
Например, создадим маску из двух доступов:
| var access = 0; // изначально никаких прав
|
|
|
| access = access | ACCESS_GOODS_VIEW; // добавили один доступ
|
| access = access | ACCESS_GOODS_CHANGE; // добавили другой доступ
|
|
|
| alert(access.toString(2)); // "00110" в бинарном виде
|
| alert(access); // число 6
|
Можно поступить и проще:
| var access = ACCESS_GOODS_VIEW | ACCESS_GOODS_CHANGE;
|