Russian Qt Forum
Ноябрь 23, 2024, 02:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: функция разворота байта:младшие и старшие разряды поменять местами  (Прочитано 11136 раз)
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« : Июль 10, 2013, 20:23 »

Есть такое? Непонимающий
Записан

Как мало времени и как много нужно узнать
Bepec
Гость
« Ответ #1 : Июль 10, 2013, 20:34 »

qToBigEndian
qToLittleEndian

Пользуйтесь на здоровье.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Июль 10, 2013, 20:55 »

Пользуйтесь на здоровье.
Разряды, а не байты. Улыбающийся
Записан
Bepec
Гость
« Ответ #3 : Июль 10, 2013, 20:57 »

Извиняйте. Чуток ошибся, бывает Улыбающийся Тогда незнаю, разве что операциями сдвига Подмигивающий

Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #4 : Июль 10, 2013, 21:36 »

Похоже придется самому рисовать Смеющийся
Записан

Как мало времени и как много нужно узнать
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Июль 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;
}
 
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Июль 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;
}
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Июль 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;
}
 
« Последнее редактирование: Июль 12, 2013, 13:45 от Old » Записан
Alex03
Гость
« Ответ #8 : Июль 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 беззнаковый.
плюсы - нет ветвлений.
Записан
Akon
Гость
« Ответ #9 : Июль 27, 2013, 02:17 »

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

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

Записан
Fat-Zer
Гость
« Ответ #10 : Июль 27, 2013, 06:53 »

если уж говорить о скорости, то это делается так: генерится таблица из 256-ти байт (любым способом) и по ней просто возвращается индекс.... Подмигивающий
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Июль 27, 2013, 06:59 »

если уж говорить о скорости, то это делается так: генерится таблица из 256-ти байт (любым способом) и по ней просто возвращается индекс.... Подмигивающий
Лучше так сформулировать: Возвращается значение из таблицы, а исходный байт выступает в качестве индекса. Улыбающийся
« Последнее редактирование: Июль 27, 2013, 07:01 от Old » Записан
Akon
Гость
« Ответ #12 : Июль 28, 2013, 08:51 »

Цитировать
Возвращается значение из таблицы, а исходный байт выступает в качестве индекса.
Да, это табличная оптимизация.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.105 секунд. Запросов: 23.