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

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

28.09.2016, 15:20. Показов 10381. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru