Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/82: Рейтинг темы: голосов - 82, средняя оценка - 4.51
3 / 3 / 1
Регистрация: 22.11.2009
Сообщений: 61

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

22.11.2009, 13:23. Показов 17363. Ответов 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;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.11.2009, 13:23
Ответы с готовыми решениями:

Циклический сдвиг битов!
Очень срочно нужна помощь. Нужно реализовать функцию, которая осуществляет циклический сдвиг битов на 1 бит вправо в левом полубайте...

Циклический сдвиг битов
Добрый день. Не знаю как решить задачу. Нужна помощь. Задача: Создайте функцию, которая перемещает биты для unsigned int на заданное...

Циклический сдвиг битов
Создайте функцию, которая перемещает биты для unsigned int на заданное число битов влево, причем выходящие при сдвиге за левую границу...

8
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.11.2009, 13:31
А ты в том примере самую первую строку замени на "typedef unsigned char type_t;"
0
3 / 3 / 1
Регистрация: 22.11.2009
Сообщений: 61
22.11.2009, 14:06  [ТС]
Сделал таким образом:
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
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.11.2009, 14:11
Покажи весь код, чтобы запустить и повторить можно было
Когда я в прошлый раз писал, то не проверял, просто теоретически написал
0
эволюционирую потихоньку
 Аватар для TanT
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
22.11.2009, 14:11
отрезай лишнее, как бы так
C++
1
return ((arg << n) | hi)&0x3F; //or'ом записываем туда вырезанную старшую часть
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.11.2009, 14:15
C
1
bitsize = 6; // битовый размер типа
Я правильно понимаю, что тебе нужно циклически сдвигать только в рамках 6 битов?

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

C
1
return ((arg << n) | hi) & ((1 << bitsize) - 1);
0
3 / 3 / 1
Регистрация: 22.11.2009
Сообщений: 61
22.11.2009, 14:16  [ТС]
Цитата Сообщение от 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);
   }
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.11.2009, 14:23
Или не... тут пораскинуть мозгами надо

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

Добавлено через 3 минуты
Собственно, работает
http://codepad.org/QLKvKFQR
1
3 / 3 / 1
Регистрация: 22.11.2009
Сообщений: 61
22.11.2009, 14:23  [ТС]
Поставил вариант
C++
1
return ((arg << n) | hi) & ((1 << bitsize) - 1);
и всё заработало!
Спасибо за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.11.2009, 14:23
Помогаю со студенческими работами здесь

Циклический сдвиг битов в строке
Пишу шифрование IDEA. Там есть ключ длинной 128 бит. Этот ключ нужно сдвинуть на 25 бит влево... Собственно накалякал сдвиг для...

Циклический сдвиг битов в байте
Привет. Мне нужно в байте (unsigned char) произвести циклический сдвиг. Как я понимаю &gt;&gt; и &lt;&lt; это не циклический сдвиг. Но как...

Циклический сдвиг битов по столбцу в битовой матрице
Нужна програмка которая создаёт матрицу битов 8х8 и дает возможность делать в ней цикличные сдвики вверх(или вниз) то есть биты с...

Циклический сдвиг битов в байте влево или вправо
Кто-нибудь пробовал реализовать такую задачу на С++. Если да, то какой алгоритм? Например, если 32 &lt;&lt; 10, то в результате должны...

Осуществить циклический сдвиг битов в целом числе a на k позиций вправо
Осуществить циклический сдвиг битов в целом числе a на k позиций вправо.


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru