Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
LonerZzz
тыжПрограммист
315 / 132 / 31
Регистрация: 21.04.2014
Сообщений: 587
#1

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

17.12.2014, 22:23. Просмотров 831. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Циклический сдвиг битов в строке (C++):

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

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

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

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

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

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

6
LonerZzz
тыжПрограммист
315 / 132 / 31
Регистрация: 21.04.2014
Сообщений: 587
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
Модератор
6744 / 5153 / 492
Регистрация: 14.02.2011
Сообщений: 17,320
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
тыжПрограммист
315 / 132 / 31
Регистрация: 21.04.2014
Сообщений: 587
05.01.2015, 00:13  [ТС] #4
Цитата Сообщение от ValeryS Посмотреть сообщение
или в байтах массив 16 чаров?
или строка на 16 элементов.
Пример:
C++
1
string Key = "1234567890123456";
Цитата Сообщение от ValeryS Посмотреть сообщение
нужно за скобки вынести иначе у тебя при каждой итерации индекс увеличивается
так и нужно...в каждой ячейке массива хранится бит...если я вынесу за цикл..то получу 16 элементов ..тобишь первый бит каждого символа..
16 байт = 128 бит.

со сдвигом массива битов проблем не возникло...собрать массив из 128 битов обратно в строку - проблема.
0
ValeryS
Модератор
6744 / 5153 / 492
Регистрация: 14.02.2011
Сообщений: 17,320
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
тыжПрограммист
315 / 132 / 31
Регистрация: 21.04.2014
Сообщений: 587
05.01.2015, 00:40  [ТС] #6
Спасибо...то что..нужно...благодаря вам я нашёл ошибку и в своём коде)..Спасибо
0
Байт
Диссидент
Эксперт C
16825 / 11090 / 1743
Регистрация: 24.12.2010
Сообщений: 21,771
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
Привет! Вот еще темы с ответами:

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

Циклический сдвиг - C++
Ребята, в чем может быть проблема? Надо организовать ф-цию циклического сдвига вправо. ТО бишь x-&gt;y, y-&gt;z, z-&gt;x. Что я делаю не так? ...

циклический сдвиг - C++
написать программу на СИ (обычном ,НЕ Си++), используя символьные массивы : Если число отрицательных элементов масива А чётно,то...

Циклический сдвиг - C++
Здравствуйте помогите пожалуйста мне надо все нечетные строки матрицы сдвинуть циклически на К элементов влево. Знаю тут ужас но не...


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

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

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