Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зеркальное отражение слова, старший бит сделать младшим, а мл старши 
:(
    Опции темы
BBulat
Дата 29.8.2007, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.12.2006

Репутация: нет
Всего: нет



Есть 32-битное слово, в нем нужно зеркально отразить первые 16 бит, т.е. 0-й бит поставить на место 15-го, а 15-й на место 0-го и т.д.
Задача решается путем последовательного наложения масок 0х8000 и 0х1 на исходное число и смещения этих масок вправо и влево на 1 бит соответственно.

Код

int n = 0xE003; //исходное число
unsigned int m1=0x8000;//маска
unsigned int m2=0x1;
int i;
void main()
{
  for(i=0; i<8; i++)
  {
    unsigned int t1 = n&m1;//накладываем маску
    unsigned int t2 = n&m2;
    t1=t1>>(15-2*i);//смещаем от краев слова к центру
    t2=t2<<(15-2*i);
    n=(n&(~m1)&(~m2))|t1|t2;//формируем новое (перевернутое число)
    m1=m1>>1;//смещаем маску
    m2=m2<<1;  
  }
}


но этот код требует слишком много операций. Можно как-нибудь ускорить эту прогу?
Заранее благодарен!
PM MAIL   Вверх
FiMa1
Дата 29.8.2007, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Под операцией реверса байтов подразумевается аналогичное отображение четырех байтов регистра. Операция реверса байтов необходима при преобразовании данных между форматом, когда первым идет младший байт (little-endian), который используется, например, DEC и Intel, и форматом, когда первым идет старший байт (big-endian), использующийся большинством других производителей.
Ниже показан эффективный метод реверса битов в слове: в первой строке меняются местами соседние биты, во второй — соседние 2-битовые поля и т.д. Все пять операторов присвоения можно выполнять в произвольном порядке. Уоррен Г. Алгоритмические трюки для программистов.
Код
#include <iostream>

unsigned reverse(unsigned x)
{
    x = (x & 0x55555555) <<  1 | (x & 0xAAAAAAAA) >>  1;
    x = (x & 0x33333333) <<  2 | (x & 0xCCCCCCCC) >>  2;
    x = (x & 0x0F0F0F0F) <<  4 | (x & 0xF0F0F0F0) >>  4;
    x = (x & 0x00FF00FF) <<  8 | (x & 0xFF00FF00) >>  8;
    x = (x & 0x0000FFFF) << 16 | (x & 0xFFFF0000) >> 16;
    
    return x;
}

int main()
{
    unsigned v = 65535; // 00000000000000001111111111111111
    std::cout << reverse(v); // 11111111111111110000000000000000

    return 0;
}


Это сообщение отредактировал(а) FiMa1 - 29.8.2007, 09:02
PM   Вверх
W4FhLF
Дата 3.9.2007, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Здесь я приводил оптимизированный на скорость и размер вариант решения задачи. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0425 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.