Russian Qt Forum

Программирование => Общий => Тема начата: Примерный ученик от Июль 10, 2013, 20:23



Название: функция разворота байта:младшие и старшие разряды поменять местами
Отправлено: Примерный ученик от Июль 10, 2013, 20:23
Есть такое? ???


Название: Re: функция разворота байта:младшие и старшие разряды поменять местами
Отправлено: Bepec от Июль 10, 2013, 20:34
qToBigEndian
qToLittleEndian

Пользуйтесь на здоровье.


Название: Re: функция разворота байта:младшие и старшие разряды поменять местами
Отправлено: Old от Июль 10, 2013, 20:55
Пользуйтесь на здоровье.
Разряды, а не байты. :)


Название: Re: функция разворота байта:младшие и старшие разряды поменять местами
Отправлено: Bepec от Июль 10, 2013, 20:57
Извиняйте. Чуток ошибся, бывает :) Тогда незнаю, разве что операциями сдвига ;)



Название: Re: функция разворота байта:младшие и старшие разряды поменять местами
Отправлено: Примерный ученик от Июль 10, 2013, 21:36
Похоже придется самому рисовать ;D


Название: Re: функция разворота байта:младшие и старшие разряды поменять местами
Отправлено: Old от Июль 10, 2013, 21:38
Да вот как-то так можно сделать:
Код
C++ (Qt)
unsigned char invert( unsigned char src )
{
       unsigned char dst = 0;
       int cnt = 8;
       for(;;)
       {
               dst |= src & 0x01;
               if( !--cnt ) break;
               dst <<= 1;
               src >>= 1;
       }
       return dst;
}
 


Название: Re: функция разворота байта:младшие и старшие разряды поменять местами
Отправлено: kambala от Июль 10, 2013, 21:48
или так:
Код
C++ (Qt)
unsigned char invert(unsigned char src)
{
   const char bits = 8;
   unsigned char dst = 0;
   for (char i = 1; i <= bits; ++i)
   {
       unsigned char power = qPow(2, i-1), bit = src & power ? 1 : 0, invertedBit = bit << (bits - i);
       dst += invertedBit;
   }
   return dst;
}


Название: Re: функция разворота байта:младшие и старшие разряды поменять местами
Отправлено: Old от Июль 12, 2013, 09:37
Сделал универсальной:
Код
C++ (Qt)
template<typename T>
T invert( T src )
{
       T dst = 0;
       size_t cnt = sizeof( T ) * 8;
       for(;;)
       {
               dst |= src & 0x01;
               if( !--cnt ) break;
               dst <<= 1;
               src >>= 1;
       }
       return dst;
}
 


Название: Re: функция разворота байта:младшие и старшие разряды поменять местами
Отправлено: Alex03 от Июль 26, 2013, 21:02
для байта
    x = ((x >> 1) & 0x55) | ((x<<1) & 0xAA);
    x = ((x >> 2) & 0x33) | ((x<<2) & 0xCC);
    x = ((x >> 4) & 0x0F) | ((x<<4) & 0xF0);
Для 16 и 32 бит соответственно ешё 1 и 2 строчки.
x беззнаковый.
плюсы - нет ветвлений.


Название: Re: функция разворота байта:младшие и старшие разряды поменять местами
Отправлено: Akon от Июль 27, 2013, 02:17
Один из тех редких случаев, когда asm рулит: ведь компилятор не врубит, что делает ваш С++ код, соответственно, оптимизация проиграет asm-варианту.
Код:
asm {
    mov al, DataByte
    mov ecx, 8
  @1:
    shr al
    rcl bl
    loop
    mov DataByte, bl
}
Но, конечно, некроссплатформенно.

2Alex03: не знал такой вариант, спасибо. Тут по-ходу можно задать произвольный паттерн размещения.



Название: Re: функция разворота байта:младшие и старшие разряды поменять местами
Отправлено: Fat-Zer от Июль 27, 2013, 06:53
если уж говорить о скорости, то это делается так: генерится таблица из 256-ти байт (любым способом) и по ней просто возвращается индекс.... ;)


Название: Re: функция разворота байта:младшие и старшие разряды поменять местами
Отправлено: Old от Июль 27, 2013, 06:59
если уж говорить о скорости, то это делается так: генерится таблица из 256-ти байт (любым способом) и по ней просто возвращается индекс.... ;)
Лучше так сформулировать: Возвращается значение из таблицы, а исходный байт выступает в качестве индекса. :)


Название: Re: функция разворота байта:младшие и старшие разряды поменять местами
Отправлено: Akon от Июль 28, 2013, 08:51
Цитировать
Возвращается значение из таблицы, а исходный байт выступает в качестве индекса.
Да, это табличная оптимизация.