Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
тыжПрограммист
 Аватар для LonerZzz
330 / 144 / 44
Регистрация: 21.04.2014
Сообщений: 638

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

17.12.2014, 22:23. Показов 4406. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу шифрование IDEA.
Там есть ключ длинной 128 бит.

Этот ключ нужно сдвинуть на 25 бит влево...
Собственно накалякал сдвиг для unsigned short
C++
1
2
3
4
unsigned short int rol(unsigned short int a, int offset)
{
    return a << offset | a >> (16 - offset);
}
Как такое же чудо провернуть для char[16] или string?
Были идеи о переводе каждого символа в бинарный вид..
Слепить из этих битов массив на 128 элементов..сделать сдвиг и разобрать обратно по 8 бит на каждый символ..

Но как-то мне показалось не очень)

Может возможно сделать сдвиг влево на n байт не отходя от кассы?...Тобишь не создавая дополнительных массивов и прочего, а провернуть всё это дело "внутри".

Если есть такая возможность..помогите.. Если сделать не отходя от кассы нельзя..так и напишите..чтоб не рылся на просторах интернета в поисках правды.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.12.2014, 22:23
Ответы с готовыми решениями:

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

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

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

6
тыжПрограммист
 Аватар для LonerZzz
330 / 144 / 44
Регистрация: 21.04.2014
Сообщений: 638
04.01.2015, 23:38  [ТС]
Собственно проблему красиво не решил..заюзал дедовский метод..перегнал строку в массив битов..
..и решил собрать строку обратно.
вот так я достал биты
C++
1
2
3
4
5
6
7
8
9
10
11
    int n = 0;
    cout << "Входящая строка " << Key << endl << "Биты" << endl;
    for (auto p = Key.begin(); p != Key.end(); ++p) {
        char c = *p;
        for (int i = 0; i < 8; ++i) {
            BitArray[n] = ((c >> i) & 1);
            cout << BitArray[n];
            n++;        
        }
        cout << endl;
    }
а вот так пытаюсь собрать строку обратно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    int currBit = 7;
    int Bit = 0;
    char c[2] = { 0 };
    for (int i = 0; i<16; i++)
    {
        
        Bit = currBit;
        memset(c, sizeof(c), 0);
        for (int j = 7; j > -1; j--)
        {               
            //cout << "В позицию " << i << " Добавляем " << BitArray[Bit] << "С индексом " << j << endl;
            c[0] |= BitArray[Bit] << j;
            Bit--;
            //getchar();
        }
        printf("\n %d ) ====== %x %x ==============\n",i, c[0], Key[i]);
        Key[i] = c[0];
        currBit += 8;
    }
но результат почему-то разный.
Первые 8 бит совпадают - остальные нет. Уже больше 2 часов сижу и не вижу ошибки..Думал биты неверно записывает проверил все 128 бит в "ручном режиме"...записывает в правильном порядке..однако результат неверный..помогите)
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
05.01.2015, 00:10
я не понял у тебя ключ в строке
Цитата Сообщение от LonerZzz Посмотреть сообщение
Там есть ключ длинной 128 бит.
массив 128 чаров
или в байтах массив 16 чаров?
если в строке
то есть тема
Функция циклического сдвига массива
там куча алгоритмов предложена, пара моих
если в битах то проще через ассемблер организовать, можно задействовать флаг переноса
Цитата Сообщение от LonerZzz Посмотреть сообщение
C++
1
2
3
4
5
for (int i = 0; i < 8; ++i) {
            BitArray[n] = ((c >> i) & 1);
            cout << BitArray[n];
            n++;        
        }
n++; нужно за скобки вынести иначе у тебя при каждой итерации индекс увеличивается
получается вот что
C++
1
2
3
4
for (int i = 0; i < 8; ++i,  n++;  ) {
            BitArray[n] = ((c >> i) & 1);
            cout << BitArray[n];
           }
а нужно
C++
1
2
3
4
5
for (int i = 0; i < 8; ++i) {
            BitArray[n] = ((c >> i) & 1);
            cout << BitArray[n];
                   }
  n++;
Добавлено через 1 минуту
Цитата Сообщение от LonerZzz Посмотреть сообщение
char c = *p;
и здесь
C++
1
unsigned char c = *p;
Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
а нужно
пардон наврал
нужно
вот так
C++
1
2
3
4
5
6
BitArray[n]=0;
for (int i = 0; i < 8; ++i) {
            BitArray[n] |= ((c) & 1<<i);
            cout << BitArray[n];
          }
  n++;
1
тыжПрограммист
 Аватар для LonerZzz
330 / 144 / 44
Регистрация: 21.04.2014
Сообщений: 638
05.01.2015, 00:13  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
или в байтах массив 16 чаров?
или строка на 16 элементов.
Пример:
C++
1
string Key = "1234567890123456";
Цитата Сообщение от ValeryS Посмотреть сообщение
нужно за скобки вынести иначе у тебя при каждой итерации индекс увеличивается
так и нужно...в каждой ячейке массива хранится бит...если я вынесу за цикл..то получу 16 элементов ..тобишь первый бит каждого символа..
16 байт = 128 бит.

со сдвигом массива битов проблем не возникло...собрать массив из 128 битов обратно в строку - проблема.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
05.01.2015, 00:25
Цитата Сообщение от LonerZzz Посмотреть сообщение
или строка на 16 элементов.
Цитата Сообщение от LonerZzz Посмотреть сообщение
"1234567890123456"
в памяти будет лежать
0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x38 0x39 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x00
точно этого хотел?
Цитата Сообщение от LonerZzz Посмотреть сообщение
.собрать массив из 128 битов обратно в строку
это случай когда строка нафиг не нужна
массив чаров и все делается просто

C++
1
2
3
4
5
6
7
for(int i=0; i<16; i++)
{ 
 Key[i]=0;
  for(int j=0;j<8;j++)
    Key[i]|=BitArray[i*8+j]<<j
}
Key[16]=0;// чтобы превратить  Key в строку
1
тыжПрограммист
 Аватар для LonerZzz
330 / 144 / 44
Регистрация: 21.04.2014
Сообщений: 638
05.01.2015, 00:40  [ТС]
Спасибо...то что..нужно...благодаря вам я нашёл ошибку и в своём коде)..Спасибо
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
05.01.2015, 00:43
Попробуй так.
C++
1
2
3
4
5
6
7
8
9
10
unsigned char s[9] = "abcd1234", r[9];
memset(r, 0, 9);
n = 25; // на сколько битов сдвигать
k = n/8;
m = n%8;
for(i = 8-k, j=7, d=0; i>=0; i--, j--) {
  unsigned char c = s[j];
  r[i] = (c<<m) + d;
  d = (c>>(8-m);
}
Не проверял, считай за псевдо-код
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.01.2015, 00:43
Помогаю со студенческими работами здесь

Циклический сдвиг битов 2
Помогите пожалуйста решить вопрос. Необходимо реализовать на С++ операцию циклического сдвига битов влево и вправо. Поиском наткнулся на...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
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