Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Нужен алгоритм пересортировки битов в обратном порядке  (Прочитано 3600 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Alice1144
Гость
« : 07-03-2009 06:19 » 

Подскажите быстрый алгоритм
Есть число  unsigned long int (32 бита) необходимо пересортировать биты в обратном порядке:
например 11100...10 ->   01...00111
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 07-03-2009 08:19 » 

Э... Не раз уже обсуждалось и примеры были разнообразные.

Например, табличный метод: создаешь заранее таблицу unsigned char[256] с готовыми значениями, потом кадый байт 32-битного числа пропускаешь через таблицу и переставляешь их в обратном порядке.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 07-03-2009 08:53 » 

Код:
#include <windows.h>


//вспомогательная структура для способа №1
struct s_change
{
private:
union
{
DWORD dwd32;

struct
{
DWORD bit00:1;
DWORD bit01:1;
DWORD bit02:1;
DWORD bit03:1;
DWORD bit04:1;
DWORD bit05:1;
DWORD bit06:1;
DWORD bit07:1;
DWORD bit08:1;
DWORD bit09:1;
DWORD bit10:1;
DWORD bit11:1;
DWORD bit12:1;
DWORD bit13:1;
DWORD bit14:1;
DWORD bit15:1;
DWORD bit16:1;
DWORD bit17:1;
DWORD bit18:1;
DWORD bit19:1;
DWORD bit20:1;
DWORD bit21:1;
DWORD bit22:1;
DWORD bit23:1;
DWORD bit24:1;
DWORD bit25:1;
DWORD bit26:1;
DWORD bit27:1;
DWORD bit28:1;
DWORD bit29:1;
DWORD bit30:1;
DWORD bit31:1;
};
};

public:
static DWORD get_changed_bits(DWORD dwd)
{
s_change Xsrc;
s_change Xdst;
Xsrc.dwd32=dwd;

Xdst.bit00=Xsrc.bit31;
Xdst.bit01=Xsrc.bit30;
Xdst.bit02=Xsrc.bit29;
Xdst.bit03=Xsrc.bit28;
Xdst.bit04=Xsrc.bit27;
Xdst.bit05=Xsrc.bit26;
Xdst.bit06=Xsrc.bit25;
Xdst.bit07=Xsrc.bit24;
Xdst.bit08=Xsrc.bit23;
Xdst.bit09=Xsrc.bit22;
Xdst.bit10=Xsrc.bit21;
Xdst.bit11=Xsrc.bit20;
Xdst.bit12=Xsrc.bit19;
Xdst.bit13=Xsrc.bit18;
Xdst.bit14=Xsrc.bit17;
Xdst.bit15=Xsrc.bit16;
Xdst.bit16=Xsrc.bit15;
Xdst.bit17=Xsrc.bit14;
Xdst.bit18=Xsrc.bit13;
Xdst.bit19=Xsrc.bit12;
Xdst.bit20=Xsrc.bit11;
Xdst.bit21=Xsrc.bit10;
Xdst.bit22=Xsrc.bit09;
Xdst.bit23=Xsrc.bit08;
Xdst.bit24=Xsrc.bit07;
Xdst.bit25=Xsrc.bit06;
Xdst.bit26=Xsrc.bit05;
Xdst.bit27=Xsrc.bit04;
Xdst.bit28=Xsrc.bit03;
Xdst.bit29=Xsrc.bit02;
Xdst.bit30=Xsrc.bit01;
Xdst.bit31=Xsrc.bit00;

return Xdst.dwd32;
}
};

void main()
{
const DWORD dwdNum=0x12345678;

//первый способ, при помощи битовых полей
DWORD dwdResult1=s_change::get_changed_bits(dwdNum);

//второй способ, перестановка в цикле
DWORD dwdResult2=0;
DWORD dwdScanMask=0x00000001;//самый младший бит
DWORD dwdSetMask_=0x80000000;//самый старший бит

for(;dwdScanMask;)
{
if(dwdNum&dwdScanMask)
{
dwdResult2|=dwdSetMask_;
}

dwdScanMask<<=1;
dwdSetMask_>>=1;
}

//сравниваем результаты обоих методов
if(dwdResult1==dwdResult2)
{
//методы выдали одинаковый результат
}
else
{
//где то ошибка
}
}

1 способ - быстрее
2 способ - чуточку медленнее
« Последнее редактирование: 07-03-2009 09:05 от Алексей1153++ » Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines