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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перестановка бит в двоичном числе 
:(
    Опции темы
DmbITpo
Дата 10.4.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В общем надо поменять местами первый бит и последний, второй и предпоследний и т.д. 

Вот такая вот задачка. Надо решить. 
Поменять местами эти биты надо в числе двоичном, например таком: 0010001. Результат должен быть 1000100 . 
В принципе она не сложная, если загнать это число в массив и потом менять местами элементы. Но вся соль состоит в том, что нужно _обязательно_ исспользовать побитовые операции (типа &, | или ^). 

Задание в общем такое :
Дан текст, надо  в каждой его букве таким вот образом переставить биты. Следовательно получиться другой символ. Типа закодировать надо текст таким образом. 


У меня уже мозги кипят. Ничё умного не могу придумать. 
Может вы поможете ? 

Язык программирования - Си. Но если вы знаете как написать на другом языке - пишите. Мне важен именно алгоритм.... 

Может хоть какие-нить идеи подкините...

Это сообщение отредактировал(а) DmbITpo - 10.4.2008, 22:34
PM MAIL   Вверх
korian
Дата 10.4.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



Код

    char str[9] = "11100010";
    char number = strtol(str, NULL, 2);
    char newnumber = 0;
    for (int i = 0; i < 8; ++i)
        newnumber = newnumber | (((number >> i) & 1) << (7-i));
    itoa(newnumber, str, 2);


Это сообщение отредактировал(а) korian - 10.4.2008, 18:52
PM   Вверх
vinter
Дата 10.4.2008, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Код

int nSrc = 0xFFEAB564;
int nTmp1 = nSrc & 0xFFFF ;
int nTmp2 = nSrc & 0x0000FFFF;
nTmp1 = nTmp1 >> 16;
nTmp2 = nTmp2 << 16;
int nDst = nTmp1 | nTmp2;


  smile 

Это сообщение отредактировал(а) vinter - 10.4.2008, 18:54


--------------------
Мой блог
PM MAIL WWW   Вверх
korian
Дата 10.4.2008, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



vinter, в вашем коде nDst == (nSrc & 0xFFFF).

Это сообщение отредактировал(а) korian - 10.4.2008, 18:55
PM   Вверх
vinter
Дата 10.4.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



угу, забыл две инструкции добавить


--------------------
Мой блог
PM MAIL WWW   Вверх
korian
Дата 10.4.2008, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



все равно не то =)
во первых условие задачи другое, а во вторых нолики не там smile 
PM   Вверх
DmbITpo
Дата 10.4.2008, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



korian,ого!  это просто гениально! неужели ты просто мыслишь битовыми операциями? =) Спасибо огромное!
Щас попробую набрать этот код! 

Всё работает! огромное спасибо тебе!!
жаль что тут нет снопочки СПАСИБО....

Это сообщение отредактировал(а) DmbITpo - 10.4.2008, 19:18
PM MAIL   Вверх
DmbITpo
Дата 10.4.2008, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



хм...при тестировании возникла проблемка. 
Попробуй , например перевернуть строку "011";
Получается какой-то бред....
PM MAIL   Вверх
korian
Дата 10.4.2008, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



мой пример работает тока с 8 битами.
и строка 011 (00000011) преобразовывается в 11000000
PM   Вверх
MastEdm
Дата 10.4.2008, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Master
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.12.2005
Где: Москва, МГИУ

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



Вот реверс 32-битной последовательности
Код

unsigned rev(unsigned x) {
    x = (x & 0x55555555) << 1 | (x >> 1) & 0x55555555;
    x = (x & 0x33333333) << 2 | (x >> 2) & 0x33333333;
    x = (x & 0x0F0F0F0F) << 4 | (x >> 4) & 0x0F0F0F0F;
    x = (x << 24) | ((x & 0xFF00) << 8) | ((x >> 8) & 0xFF00) | (x >> 24);
    return x;
}

PM MAIL   Вверх
blinded
Дата 10.4.2008, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Все прсто замечательно. Вот только со знаковыми типами результат сдвига влево implementation defined
PM MAIL   Вверх
MastEdm
Дата 10.4.2008, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Master
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.12.2005
Где: Москва, МГИУ

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



Ну можно схитрить:
Код

int a = -100;
unsigned b = *(unsigned*)(&a);


Правда нужно реально представлять, что из этого получится  smile 

Это сообщение отредактировал(а) MastEdm - 10.4.2008, 21:35
PM MAIL   Вверх
korian
Дата 10.4.2008, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



Цитата(blinded @  10.4.2008,  20:31 Найти цитируемый пост)
Вот только со знаковыми типами результат сдвига влево implementation defined 

имху битовые операции изначально implementation defined. так что про сдвиг смысла нету думать.

Это сообщение отредактировал(а) korian - 10.4.2008, 21:41
PM   Вверх
MAKCim
Дата 10.4.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(blinded @  10.4.2008,  21:31 Найти цитируемый пост)
Все прсто замечательно. Вот только со знаковыми типами результат сдвига влево implementation defined 

это еще почему?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
mes
Дата 10.4.2008, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(DmbITpo @  10.4.2008,  18:17 Найти цитируемый пост)
В общем надо поменять местами первый бит и последний, второй и предпоследний и т.д. 

Цитата(DmbITpo @  10.4.2008,  18:17 Найти цитируемый пост)
например таком: 0010001. Результат должен быть 1010000 . 

Что то условие с примером не совпадают ))
во вторых не указано  размерность числа, а также ее постоянность
для  8 битного например подходит такая конструкция :

Код

byte func (byte source)
{
return    ((source & 128) ? 1:0)
            |  ((source &  64) ? 2:0)
            |  ((source &  32) ? 4:0)
            |  ((source & 16) ? 8:0)
            |  ((source & 8)  ? 16:0)
            |  ((source & 4)  ? 32:0)
            |  ((source & 2)  ? 64:0)
            |  ((source & 1)  ? 128:0);
};


P.S. где то эта тема уже обсуждалась

Это сообщение отредактировал(а) mes - 10.4.2008, 22:08


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0640 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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