Модификация индекса массива

Тема в разделе "WASM.RESEARCH", создана пользователем ormoulu, 3 сен 2019.

  1. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Код (Text):
    1.  
    2.     if ( (index & 0xE0000000) != 0x20000000 )
    3.         index = index & 0x1FFFFFFF | 0x40000000;
    4.  
    index - индекс применяемый к BYTE массиву. Таким способом он (индекс) модифицируется для хранения.
    Перед использованием индекс снова приводится к index & 0x1FFFFFFF.
    Вопрос - для чего это нужно? В чем смысл такой операции помимо ограничения в 0x1FFFFFFF?
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.952
    Проверяется не равен ли 29й бит единице (есть ли переполнение 0--0x1FFFFFFF), и если нет, 30й бит устанавливается в 1. Смысла в конъюнкции с 0x1FFFFFFF нету, разве что каким-то чудом старший бит окажется единицей.
     
  3. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Вопрос, зачем вообще это сделано? Почему проверяется именно 29й бит, для чего устанавливается 30й? Подозреваю, что приехало с каким-то макросом.
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.952
    3 старших бита скорей всего используются как флаги, сам индекс 29бит и может адресовать всего 512мб, видимо больше и не надо. Оптимизация.
     
  5. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    f13nd, вы правы. Это флаги. Видимо, место экономится таким способом.