Подтвердить что ты не робот

Как эффективно выполнять бит-сдвиг без ( "<<" || ">>" ) оператора?

Я работаю над шейдером OpenGL ES 2.0, и у меня плотно упакованные данные, например. три 5-разрядных целых числа без знака в блоке из двух байтов. Чтобы распаковать эти данные, я, очевидно, нуждаюсь в перестановке битов, но это не поддерживается в языке Shading Language OpenGL (см. Стр. 29 http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdf)

Следовательно, я выполняю ряд операций * 2 и /2 для эмулирования смещения битов.

Кто-нибудь знает более эффективный/элегантный способ сделать это? Есть ли трюк, о котором я не знаю?

Спасибо!

4b9b3361

Ответ 1

Я никогда не использовал OpenGL, но самым эффективным методом будет 16-битная таблица поиска для каждого типа, если ваша среда поддерживает ее. Вам нужно будет заполнить таблицу один раз при запуске, но это должно быть очень быстро. Вы можете использовать отдельные таблицы для каждого типа или двумерной таблицы, например, таблицу [65536] [3].

Ответ 2

Если вы выполняете несколько смен, вы можете использовать силовые операции. Я думаю, что бит-сдвиг является умножением или делением на 2 n и операция с мощностью будет более читаемой, чем несколько операций умножения или деления, но я не уверен в производительности. Я полагаю, что это более элегантное решение, но, вероятно, не более эффективное.

Ответ 3

В зависимости от того, что вы делаете, эти потоки могут быть полезны:

GLSL: упаковка нормального в одном плавании ссылка

Упаковка нескольких поплавков в одно значение float ссылка

Упаковка плавает до различных целей бит-бит (нужно искать на форуме OpenGL.org, поскольку переполнение стека не позволяет больше, чем 2 ссылки для новых пользователей)

Ответ 4

Из вашего вопроса я не уверен, но вы можете использовать & (бит-и), правильно? Тогда должно быть довольно быстро написать:

processing(variable & 11111); processing(variable & 1111100000); (...)

Эти битовые маски должны быть сохранены как интегральные константы, конечно.