Страницы

Поиск по вопросам

вторник, 17 марта 2020 г.

Битовые операции - алгоритм

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

Комментариев нет:

Отправить комментарий