#битовые_операции #алгоритм #javascript
Доброго времени суток.
Встала одна интересная задача.
Есть модели данных. Каждая модель имеет свой битовый идентификатор. Например:
User: 0x1
Organization: 0x2
Points: 0x4
.....
У любой модели есть список параметров и есть функция getData(flag), которая которая
возвращает параметры по битовой маске.
Пример:
Model User {
TYPE: items.TYPE.USER; // 0x1
getFlags: function() {
Id: 0x1,
Name: 0x2,
Owner: 0x4....
}
getData(flag) {
var dl = this.getFlags();
var a = {};
for(var i in dl) {
var tf = dl[i];
if(fl & flag) {
a[i] = this['get' + i]();
}
}
return a;
}
}
Model Organization { ... }
Задача - реализовать функцию, которая по 2-м параметрам (битовым маскам) будет возвращать
items-ы с необходимой информацией.
Пример:
/**
* flag - битовая маска модулей
* info битовая маска информативности по модулям
*/
getItems(flag, info) { ...; return items; };
Например, задача выцепить пользователей, но чтобы мне вернулись только их ID и выцепить
организации, но только чтобы вернулись имена.
Вопрос - как грамотно составить маску info?
flag = User.TYPE + Organization.TYPE
info - ?
И встаёт дополнительный вопрос - как в JavaScript можно оперировать большими битовыми
флагами ? Большие числа будут сокращаться же :-(
<< 100000000000000000111
>> 100000000000000000000
Ответы
Ответ 1
Если я правильно понял задачу, то flag = User.TYPE | Organization.TYPE; // не +. Сейчас разницы нет, но на будущее info = {}; info[User.TYPE] = User.getFlags().Id | User.getFlags().Name; info[Organization.TYPE] = Organization.getFlags().Name; Почему так: внезапно в JS нельзя инициализировать объект с переменными в названиях свойств (в кратком формате). Я только что это узнал %) Объект формата type => mask выбрал потому, что, судя по всему, вы собираетесь работать с большими масками. В другом случае это может быть простой массив масок ((User.TYPE << 16) | User.getFlags().Id) с разбором в функции. По второй части вопроса - динамическая типизация JS + разноразрядность осей съест вам голову. Для работы с "большими масками" лучше использовать массивы, а при проверке передавать еще смещения Т.е. маска в 64 бита - это массив 2 х int32 var mask64 = [ 0x00020000, 0x00200080 ]; , а проверка 62-го бита - это test(0x00000002 /*30-й бит*/ , 1/* смещение в 32 бит */) Как-то так вроде.
Комментариев нет:
Отправить комментарий