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

Форум программистов: 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 ] 


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

Зарегистрированные пользователи: Yahoo [Bot]


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

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