Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/55: Рейтинг темы: голосов - 55, средняя оценка - 4.75
5 / 5 / 7
Регистрация: 08.10.2010
Сообщений: 228

Циклический сдвиг битов в байте влево или вправо

28.09.2016, 15:20. Показов 10300. Ответов 19
Метки нет (Все метки)

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

Читаю Уоррен Генри - Алгоритмические трюки для программистов - 2014, он пишет (screenshot во вложении).
Используем формулу для циклического сдвига влево на n разрядов: y <- (x<<n)|(x>>(32-n)).
В результате получаем: y <- (32 << 10) | (32 >> (32-10))
y <- (32 << 10) | (32 >> 22)
y <- 32768 | 0
y = 32768
Результаты явно отличатся друг от друга. Или может быть я не правильно считаю?
Миниатюры
Циклический сдвиг битов в байте влево или вправо  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.09.2016, 15:20
Ответы с готовыми решениями:

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

Циклический сдвиг массива влево и вправо
Нужно реализовать циклический сдвиг массива влево и вправо! Например есть массив int- {121605}? mass_len=6, нужно чтобы после сдвига...

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

19
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
28.09.2016, 15:25
Цитата Сообщение от Дима_Кирсанов Посмотреть сообщение
Например, если 32 << 10, то в результате должны получить 128
Как это? У тебя размер целого какой?
0
5 / 5 / 7
Регистрация: 08.10.2010
Сообщений: 228
28.09.2016, 15:37  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Как это? У тебя размер целого какой?
Пока не знаю. В числе должно быть 8 разрядов. 32 = 00100000.

Цитата Сообщение от nmcf Посмотреть сообщение
Например, если 32 << 10, то в результате должны получить 128
Не веришь? А ты сам попробуй переставить единицу 10 раз влево с циклическим переходом.
0
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
28.09.2016, 15:51
Дима_Кирсанов, чтобы сдвиги проверить можно так делать
32 << 10 это эквивалент 32 * 210, естественно при сдвиге вправо деление на два в степени сдвига
0
5 / 5 / 7
Регистрация: 08.10.2010
Сообщений: 228
28.09.2016, 16:13  [ТС]
Цитата Сообщение от obivan Посмотреть сообщение
чтобы сдвиги проверить можно так делать
32 << 10 это эквивалент 32 * 210, естественно при сдвиге вправо деление на два в степени сдвига
Я это все понимаю. Но тогда что имел ввиду У.Генри под словом циклический?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
28.09.2016, 16:14
Тут нужно брать остаток от деления на 8 от n, а уже потом подставлять в формулу.

Добавлено через 22 секунды
Дима_Кирсанов, покажи свою программу.
0
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
28.09.2016, 16:45
Дима_Кирсанов, в асcемблере есть циклический сдвиг и арифмитический
пример циклического сдвига на 1
исходное число 1001 --- после сдвига 0011

пример арифмитического сдвига на 1
исходное число 1001 --- после сдвига 0010

я думаю речь об этом

Добавлено через 4 минуты
Цитата Сообщение от Дима_Кирсанов Посмотреть сообщение
если 32 << 10, то в результате должны получить 128
а насчет этого с каких таких делов 32 * 210 = 128 ?

Добавлено через 2 минуты
Циклический сдвиг подразумевает то что самое крайнее левое число запишется в начало, а все остальное сдвинет позицию на +1
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
28.09.2016, 16:45
Цитата Сообщение от obivan Посмотреть сообщение
с каких таких делов 32 * 210 = 128 ?
Да с простых. 10 % 8 == 2. 32 << 2 == 128.
1
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
28.09.2016, 16:50
Цитата Сообщение от castaway Посмотреть сообщение
Да с простых. 10 % 8
Тогда вопрос к чему это ? Вы подразумеваете ограничение вместимости числа в 1 байт ? Или я что-то не догоняю

Добавлено через 1 минуту
Аааа все я понял, это нам надо было получить 128, все вопрос отпал
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
28.09.2016, 16:51
Цитата Сообщение от obivan Посмотреть сообщение
Тогда вопрос к чему это ? Вы подразумеваете ограничение вместимости числа в 1 байт ? Или я что-то не догоняю
Сдвиг циклический. У ТС размер сдвигаемого числа равен восьми битам. Вроде всё просто, чего вы не догоняете?
0
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
28.09.2016, 16:52
Цитата Сообщение от castaway Посмотреть сообщение
У ТС размер сдвигаемого числа равен восьми битам
поздно понял
0
5 / 5 / 7
Регистрация: 08.10.2010
Сообщений: 228
28.09.2016, 19:05  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Тут нужно брать остаток от деления на 8 от n, а уже потом подставлять в формулу
Это что - подгонка под ответ?
А что будет, когда n < 8 или n >= 11?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
28.09.2016, 19:27
Цитата Сообщение от Дима_Кирсанов Посмотреть сообщение
Это что - подгонка под ответ?
Что значит "подгонка под ответ"?

Цитата Сообщение от Дима_Кирсанов Посмотреть сообщение
А что будет, когда n < 8 или n >= 11?
В обоих случаях будет правильный результат.

Похоже вы - единственный кто "недогнал" как это работает.
0
5 / 5 / 7
Регистрация: 08.10.2010
Сообщений: 228
28.09.2016, 20:44  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Похоже вы - единственный кто "недогнал" как это работает.
может быть

Цитата Сообщение от castaway Посмотреть сообщение
Сообщение от Дима_Кирсанов
А что будет, когда n < 8 или n >= 11?
В обоих случаях будет правильный результат.
Цитата Сообщение от castaway Посмотреть сообщение
Тут нужно брать остаток от деления на 8 от n, а уже потом подставлять в формулу.
Считаю: y <- (x<<n)|(x>>(32-n)), для x=32 и n=7
y <- (32<<(7%8))|(32>>(32-(7%8)))
y <- (32<<7)|(32>>25)
y <- 4096|0
y = 4096

y <- (x<<n)|(x>>(32-n)), для x=32 и n=11
y <- (32<<(11%8))|(32>>(32-(11%8)))
y <- (32<<3)|(32>>29)
y <- 256|0
y = 256

Цитата Сообщение от castaway Посмотреть сообщение
Добавлено через 22 секунды
Дима_Кирсанов, покажи свою программу.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
 
int main()
{
  //y <- (x<<n)|(x>>(32-n))
  int x = 32;
  int n = 7;
  int res = (x << (n%8))|(x >> (32 -(n%8)));
  cout << res << endl;
  return 0;
}
не знаю что тут еще добавить
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
28.09.2016, 20:54
Цитата Сообщение от Дима_Кирсанов Посмотреть сообщение
В числе должно быть 8 разрядов.
Дима_Кирсанов, ты как-нибудь там определись, 8 разрядов у тебя или 32...
0
5 / 5 / 7
Регистрация: 08.10.2010
Сообщений: 228
28.09.2016, 21:14  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
ты как-нибудь там определись, 8 разрядов у тебя или 32...
8 разрядов. Но как делать циклический сдвиг не понятно
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
28.09.2016, 21:15
Тогда char, а не int используй. И в тех формулах из книжки 32 замени на 8.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
28.09.2016, 21:20
Цитата Сообщение от Дима_Кирсанов Посмотреть сообщение
8 разрядов
А тогда какого хрена ты в своих вычислениях используешь 32?

Цитата Сообщение от Дима_Кирсанов Посмотреть сообщение
Например, если 32 << 10, то в результате должны получить 128.
Тут ты считаешь для 8-и разрядов, а в изображении из первого сообщения формула для 32-х разрядов.
0
5 / 5 / 7
Регистрация: 08.10.2010
Сообщений: 228
28.09.2016, 21:34  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
И в тех формулах из книжки 32 замени на 8.
Получается так: y <- (x<<n)|(x>>(8-n))

Цитата Сообщение от nmcf Посмотреть сообщение
Тогда char, а не int используй.
Вот тут уже сложнее:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <fstream>
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
 
int main()
{
  //y <- (x<<n)|(x>>(8-n))
  char x = '3';
  char n = '7';
  char res = (x << n)|(x >> (8 - n));
  cout << res << endl;
  return 0;
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
28.09.2016, 21:55
Зачем символы-то присвоил? Обычные числа используй.
И n можно оставить int, это же просто показатель.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.09.2016, 21:55
Помогаю со студенческими работами здесь

Циклический сдвиг целого числа на n разрядов влево и вправо
Такая ситуация. Написать функцию, циклически сдвигающую целое число на N разрядов вправо или влево, в зависимости от третьего параметра...

Циклический сдвиг односвязного списка, организованного структурами, на N элементов вправо/влево
Подскажите, как лучше всего циклически сдвинуть односвязный список, организованный структурами, на N элементов вправо/влево, может ему...

Обеспечить сдвиг столбцов матрицы вправо или влево в зависимости от знака вводимого числа сдвигов
Дана целочисленная матрица размерности n x m. Обеспечить сдвиг столбцов матрицы вправо или влево в зависимости от знака вводимого числа...

Где и когда уместно применять операции << (сдвиг влево) и >> (сдвиг вправо)?
Кто может привести пример , когда нужно использовать операции: 1) &lt;&lt; сдвиг влево 2) &gt;&gt; сдвиг вправо

Циклический сдвиг битов в байте влево или вправо
Всем привет.Нужно реализовать Циклический сдвиг битов в байте на 1 влево или на 1 вправо в зависимости от ключа.Делал разными методами, но...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты 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