Что самый быстрый путь состоит в том, чтобы получить 4 младших значащих бита в байте (C++)?

Поскольку вы конвертируете кадр камеры (NV12) в RGB, вам необходимо установить pixelFormat в OTPixelFormatARGB в videoFrame.format

7
задан phuclv 10 August 2018 в 15:16
поделиться

6 ответов

Я всегда использую x &= 0x0f

22
ответ дан 6 December 2019 в 04:44
поделиться

Краткость хороша - объяснения лучше :)

  • x &= 0x0f

конечно, правильный ответ. Это точно выражает намерение того, чего Вы пытаетесь достигнуть, и на любой нормальной архитектуре будет всегда компилировать вниз в минимальное количество инструкций (т.е. 1). Действительно используйте шестнадцатеричное число, а не десятичное число каждый раз, когда Вы помещаете константы в побитовый оператор.

  • x <<= 4; x >>= 4

будет только работать, если Ваш 'байт' будет надлежащим неподписанным типом. Если бы это был на самом деле символ со знаком затем, то вторая операция могла бы вызвать расширение знака (т.е. Ваш исходный бит 3 затем появился бы в битах 4-7 также).

без оптимизации это, конечно, возьмет 2 инструкции, но с GCC на OSX, даже -O1 уменьшит это до первого ответа.

  • x %= 16

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

37
ответ дан 6 December 2019 в 04:44
поделиться

Единственная операция И может сделать это.

x = (x & 0x0F);
4
ответ дан 6 December 2019 в 04:44
поделиться

Существует много хороших ответов, и некоторые из них являются технически правильными.

В более широком масштабе нужно понять, что C/C++ не является ассемблером. Задание программиста состоит в том, чтобы попытаться сказать компилятору намерение, чего Вы хотите достигнуть. Компилятор выберет лучший способ сделать это в зависимости от архитектуры и различных флагов оптимизации.

x& = 0x0F; самый ясный путь состоит в том, чтобы сказать компилятор, чего Вы хотите достигнуть. Если смещение вверх и вниз быстрее на некоторой архитектуре, это - задание компилятора, чтобы знать это и сделать правильную вещь.

10
ответ дан 6 December 2019 в 04:44
поделиться

Это будет зависеть от на архитектуре в некоторой степени - смещающийся и отступать на ARM, вероятно, самый быстрый путь - однако, компилятор должен сделать это для Вас. На самом деле все предложенные методы будут, вероятно, оптимизированы к тому же коду компилятором.

2
ответ дан 6 December 2019 в 04:44
поделиться

x = x и 15

0
ответ дан 6 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: