#битовые_операции #алгоритм #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 бит */) Как-то так вроде.
Комментариев нет:
Отправить комментарий