Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
LonerZzz
тыжПрограммист
317 / 132 / 43
Регистрация: 21.04.2014
Сообщений: 586
#1

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

17.12.2014, 22:23. Просмотров 1019. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2014, 22:23
Ответы с готовыми решениями:

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

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

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

Циклический сдвиг битов в байте
Привет. Мне нужно в байте (unsigned char) произвести циклический сдвиг. Как я...

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

6
LonerZzz
тыжПрограммист
317 / 132 / 43
Регистрация: 21.04.2014
Сообщений: 586
04.01.2015, 23:38  [ТС] #2
Собственно проблему красиво не решил..заюзал дедовский метод..перегнал строку в массив битов..
..и решил собрать строку обратно.
вот так я достал биты
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
ValeryS
Модератор
7169 / 5436 / 674
Регистрация: 14.02.2011
Сообщений: 18,360
05.01.2015, 00:10 #3
я не понял у тебя ключ в строке
Цитата Сообщение от 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
тыжПрограммист
317 / 132 / 43
Регистрация: 21.04.2014
Сообщений: 586
05.01.2015, 00:13  [ТС] #4
Цитата Сообщение от ValeryS Посмотреть сообщение
или в байтах массив 16 чаров?
или строка на 16 элементов.
Пример:
C++
1
string Key = "1234567890123456";
Цитата Сообщение от ValeryS Посмотреть сообщение
нужно за скобки вынести иначе у тебя при каждой итерации индекс увеличивается
так и нужно...в каждой ячейке массива хранится бит...если я вынесу за цикл..то получу 16 элементов ..тобишь первый бит каждого символа..
16 байт = 128 бит.

со сдвигом массива битов проблем не возникло...собрать массив из 128 битов обратно в строку - проблема.
0
ValeryS
Модератор
7169 / 5436 / 674
Регистрация: 14.02.2011
Сообщений: 18,360
05.01.2015, 00:25 #5
Цитата Сообщение от 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
тыжПрограммист
317 / 132 / 43
Регистрация: 21.04.2014
Сообщений: 586
05.01.2015, 00:40  [ТС] #6
Спасибо...то что..нужно...благодаря вам я нашёл ошибку и в своём коде)..Спасибо
0
Байт
Эксперт C
17839 / 11866 / 2467
Регистрация: 24.12.2010
Сообщений: 23,849
05.01.2015, 00:43 #7
Попробуй так.
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
05.01.2015, 00:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2015, 00:43

Циклический сдвиг битов в байте влево или вправо
Кто-нибудь пробовал реализовать такую задачу на С++. Если да, то какой...

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

В заданной строке выполнить циклический сдвиг на указанное число позиций
Строка символов состоит из произвольных десятичных цифр в пределах от 1 до 9,...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru