Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 40, средняя оценка - 4.83
nikitasnv777
2 / 2 / 0
Регистрация: 22.11.2009
Сообщений: 61
#1

Циклический сдвиг битов 2 - C++

22.11.2009, 13:23. Просмотров 5254. Ответов 8
Метки нет (Все метки)

Помогите пожалуйста решить вопрос. Необходимо реализовать на С++ операцию циклического сдвига битов влево и вправо. Поиском наткнулся на это:
Циклический сдвиг битов. Но это не совсем то, что мне нужно.
Имеем переменную "unsigned char bitm" со значением "0b100000", кол-во битов постоянное.
Как мне переместить последний бит в начало или первый бит в конец?

Добавлено через 19 минут
Примерно так должно быть для сдвига влево?
C++
1
2
3
4
unsigned char bitm //длина в 6 бит
unsigned char hi
hi =  (bitm >> 5) & ((1 << 1) - 1);
bitm=(bitm<<1) | hi;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2009, 13:23     Циклический сдвиг битов 2
Посмотрите здесь:

C++ Циклический сдвиг.
C++ циклический сдвиг
Циклический сдвиг битов! C++
C++ Циклический сдвиг массива
C++ Циклический сдвиг матрицы
Циклический сдвиг C++
C++ Циклический сдвиг
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17192 / 5446 / 337
Регистрация: 30.03.2009
Сообщений: 14,794
Записей в блоге: 26
22.11.2009, 13:31     Циклический сдвиг битов 2 #2
А ты в том примере самую первую строку замени на "typedef unsigned char type_t;"
nikitasnv777
2 / 2 / 0
Регистрация: 22.11.2009
Сообщений: 61
22.11.2009, 14:06  [ТС]     Циклический сдвиг битов 2 #3
Сделал таким образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
unsigned char sdvig_bita_vlevo (unsigned char arg, int n)
{
int bitsize;
unsigned char hi;
bitsize = 6; // битовый размер типа
hi =  (arg >> (bitsize - n)) & ((1 << n) - 1); // Вырезаем старшие n бит
return (arg << n) | hi; //or'ом записываем туда вырезанную старшую часть
}
   
unsigned char sdvig_bita_vpravo (unsigned char arg, int n)
{
int bitsize;
bitsize = 6; // битовый размер типа
return sdvig_bita_vlevo (arg, bitsize - n);
}
Но есть проблема! Едденица и перекидывается и остаётся, тоесть вместо 000001 получается 100001
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17192 / 5446 / 337
Регистрация: 30.03.2009
Сообщений: 14,794
Записей в блоге: 26
22.11.2009, 14:11     Циклический сдвиг битов 2 #4
Покажи весь код, чтобы запустить и повторить можно было
Когда я в прошлый раз писал, то не проверял, просто теоретически написал
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
22.11.2009, 14:11     Циклический сдвиг битов 2 #5
отрезай лишнее, как бы так
C++
1
return ((arg << n) | hi)&0x3F; //or'ом записываем туда вырезанную старшую часть
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17192 / 5446 / 337
Регистрация: 30.03.2009
Сообщений: 14,794
Записей в блоге: 26
22.11.2009, 14:15     Циклический сдвиг битов 2 #6
C
1
bitsize = 6; // битовый размер типа
Я правильно понимаю, что тебе нужно циклически сдвигать только в рамках 6 битов?

Добавлено через 1 минуту
Цитата Сообщение от TanT Посмотреть сообщение
отрезай лишнее, как бы так
C++
1
return ((arg << n) | hi)&0x3F; //or'ом записываем туда вырезанную старшую часть
Если моё предположение выше верно, то лучше так:

C
1
return ((arg << n) | hi) & ((1 << bitsize) - 1);
nikitasnv777
2 / 2 / 0
Регистрация: 22.11.2009
Сообщений: 61
22.11.2009, 14:16  [ТС]     Циклический сдвиг битов 2 #7
Цитата Сообщение от Evg Посмотреть сообщение
Покажи весь код...
C++
1
2
3
4
5
6
7
8
unsigned char sdvig_bita_vlevo (unsigned char arg, int n)
{
int bitsize;
unsigned char hi;
bitsize = 6; // битовый размер типа
hi =  (arg >> (bitsize - n)) & ((1 << n) - 1); // Вырезаем старшие n бит
return (arg << n) | hi; //or'ом записываем туда вырезанную старшую часть
}
в функции void main
C++
1
2
3
4
5
6
7
unsigned char bitm;
int i;
bitm=0b000001;                         
for (i=0; i<10; i++)
   {
   bitm=sdvig_bita_vlevo(bitm, 1);
   }
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17192 / 5446 / 337
Регистрация: 30.03.2009
Сообщений: 14,794
Записей в блоге: 26
22.11.2009, 14:23     Циклический сдвиг битов 2 #8
Или не... тут пораскинуть мозгами надо

Добавлено через 2 минуты
Хотя в посте 6 вроде бы правильно написано

Добавлено через 3 минуты
Собственно, работает
http://codepad.org/QLKvKFQR
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2009, 14:23     Циклический сдвиг битов 2
Еще ссылки по теме:

Циклический сдвиг битов C++
Циклический сдвиг битов в строке C++
Циклический сдвиг битов в байте C++
C++ Циклический сдвиг битов по столбцу в битовой матрице
C++ Циклический сдвиг битов в байте влево или вправо

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
nikitasnv777
2 / 2 / 0
Регистрация: 22.11.2009
Сообщений: 61
22.11.2009, 14:23  [ТС]     Циклический сдвиг битов 2 #9
Поставил вариант
C++
1
return ((arg << n) | hi) & ((1 << bitsize) - 1);
и всё заработало!
Спасибо за помощь!
Yandex
Объявления
22.11.2009, 14:23     Циклический сдвиг битов 2
Ответ Создать тему
Опции темы

Текущее время: 01:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru