→ Для вступления в общество новичков и профессионалов программирования, пожалуйста нажмите здесь ...

Форум программистов: C++, Basic, Delphi, Pascal, JavaScript
Логин: Пароль:
Запомнить?  
@Mail.ru



Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Перестановка бит в двоичном числе 
Автор Сообщение
Начинающий

Регистрация: 10.04.2008
Сообщения: 2

Репутация: 0 [ ? ]
Сообщение Перестановка бит в двоичном числе
В общем надо поменять местами первый бит и последний, второй и предпоследний и т.д.

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

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

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

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


10.04.2008 17:13
Профиль
Профи
Аватара пользователя

Регистрация: 26.02.2008
Сообщения: 112
Откуда: Украина

Репутация: 2 [ ? ]
Сообщение 
Алгоритм этой перестановки прост как 2х2.
Вся идея заключается в том, что нам нужно проверить установлены ли нужные биты в 1 или в 0, а потом соответственно поменять их значения.

[syntax=cpp]
//берём любое двоичное число (предполагается что оно 8-битное),
//например 01000000, нужно обменять значения второго и предпоследнего бита
unsigned char SW=0x40;
unsigned char right,left,curr;
//проверяем значение 2-го бита справа, если он равен 1, то значение right будет 00000010 или 0х02
right = SW & 0x02;
//проверяем значение 2-го бита слева, если он равен 1, то значение left будет равно 01000000 или 0х40
left =SW & 0x40;
//проверяем, если 2-й бит справа установлен в 1, то устанавливаем 2-й бит слева в 1 иначе уставаливаем в 0
if(right == 0x02)curr=SW|0x40;
else curr = SW&(~0x40);
//те же операции проводим с 2-м битом справа
if(left == 0x40)curr = curr|0x02;
else curr=curr&(~0x02);
//теперь curr равно 00000010
[/syntax]

_________________
If it works, then it created by ivan-hohol, if not, then I don't know who this created


10.04.2008 20:35
Профиль Отправить email ICQ
Начинающий

Регистрация: 10.04.2008
Сообщения: 2

Репутация: 0 [ ? ]
Сообщение 
А если третий символ надо проверять? то как ?

Сорри, но я не сильно разбираюсь в побитовых операциях, поэтому спрашиваю...


10.04.2008 23:14
Профиль
Профи
Аватара пользователя

Регистрация: 26.02.2008
Сообщения: 112
Откуда: Украина

Репутация: 2 [ ? ]
Сообщение 
Для того чтобы проверять третий или какой-нибудь другой, то для проверки нужно выбирать числа, у которых соответствующий бит установлен в 1.
Например, для проверки 3-го и 6-го бита нужно взять числа 00000100 и 00100000, умножить их на заданное число, результат сохранив в right и left соответственно и проверить.

_________________
If it works, then it created by ivan-hohol, if not, then I don't know who this created


10.04.2008 23:38
Профиль Отправить email ICQ
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 


Кто сейчас на конференции

Зарегистрированные пользователи: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
cron
© 2013 «Форум программистов Украины»