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

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

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

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

Спасибо!

Ответы [ 4 ]

5 голосов
/ 12 августа 2010

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

3 голосов
/ 08 сентября 2011

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

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

Упаковка нескольких чисел водно значение с плавающей точкой ссылка

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

1 голос
/ 01 декабря 2010

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

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

Разумеется, эти битовые маски следует сохранять как интегральные константы.

1 голос
/ 12 августа 2010

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

...