Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
rosin
0 / 0 / 0
Регистрация: 22.09.2009
Сообщений: 21
#1

Сдвиг 128-битного числа - C++

20.11.2009, 19:32. Просмотров 1379. Ответов 9
Метки нет (Все метки)

Есть строчка размером 16 байт.Как сдвинуть бинарное представление этой строки на 25 разрядов влево например.

Автор забыл упомянуть что сдвиг должен быть циклический.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TanT
эволюционирую потихоньку
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
20.11.2009, 22:08     Сдвиг 128-битного числа #2
вообще сдвиг это у нас ещё с утра было << >>

в твоём случае надо плясать от того в каком виде задана твоя строчка,
16 байт это для 32битного Int -- int x[4]; а у тебя мож как по другому задан сей объём,
отслеживать придётся элементы массива в котором хранишь свои байты
вот что-то набросал для int

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "iostream"
using namespace std;
 
 
int main()
{
    const int numCell=16/sizeof(int);
    int arr[numCell] = {0, 0, 1, 1};
    const int shift =33;
 
    int bitInCell=8*sizeof(int);
    int numElem=shift/bitInCell;
    int bitRemains=shift-numElem*bitInCell;
    
    cout<<"numElem: "<<numElem<<" bitRemains: "<<bitRemains<<endl;
    for (int i=numCell; --i>=0;) cout<<" "<<arr[i];
    cout<<endl;
    if (numElem)    // если сдвиг на ячейки
    {
        for (int i=numCell; --i>=numElem;)  arr[i]=arr[i-1]; // сдвигаем влево ячейки
        for (int i=numElem; --i>=0;)    arr[i]=0;               // новые ячейки соответсвенно пустые
    }
 
 
    if (bitRemains) // если ещё и биты подвинуть
    { int first=((numElem>1)?numElem:1);        
        for (int i=numCell; --i>=first;)
        {   
            arr[i]=arr[i]<<bitRemains+(arr[i-1]>>(bitInCell-bitRemains));
        }
        arr[first-1]=arr[first-1]<<bitRemains;
    }
 
    for (int i=numCell; --i>=0;)  cout<<" "<<arr[i];
    cout<<endl;
 
    cout << endl;   system("PAUSE");
    return 0;
}
manfeese
129 / 128 / 16
Регистрация: 04.01.2009
Сообщений: 415
20.11.2009, 23:30     Сдвиг 128-битного числа #3
Вот что я смог набросать для строковых переменных:
код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream.h>
#include <conio.h>
 
using namespace std;
 
enum TShiftState {Left=0,Right};
void StringShift (char *S, int StringSize, TShiftState SState, int bits)
{
 int Curr1=0,Curr2=0 ,k;
 
 if (SState)
 {
  for (int j = 0; j < bits; j++)
    for (int i = 0; i < StringSize-1; i++)
    {
      int k = (int)S[i];
      (k & 1) == 1 ? Curr1 = 0x80 : Curr1 = 0;
      k>>=1;
      k+=Curr2;
      S[i]=k;
      Curr2=Curr1;
    }
 }
 else
 {
  for (int j = 0; j < bits; j++)
    for (int i = StringSize-2; i >=0; i--)
    {
      int k = (int)S[i];
      (k & 0x80) == 0x80 ? Curr1 = 1 : Curr1 = 0;
      k<<=1;
      k+=Curr2;
      S[i]=k;
      Curr2=Curr1;
    }
 }
}
 
int main()
{
    char S[] = "012456789abcdef";       //строка любых значений
    cout<<S<<endl;
    StringShift(S,sizeof(S),Left,25);
    cout<<S;
 
    getch();
    return 0;
}
rosin
0 / 0 / 0
Регистрация: 22.09.2009
Сообщений: 21
21.11.2009, 14:15  [ТС]     Сдвиг 128-битного числа #4
Я забыл написать что сдвиг должен быть циклическим
odip
Эксперт С++
7153 / 3293 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
22.11.2009, 13:31     Сдвиг 128-битного числа #5
Молчаберем и сдвигаем.
25 разрядов - это 3 целых байта и еще один 1.
Значит нужно сдвинуть на 3 байта и доворачивать на один бит.
Все что вылезло слева - ( а это 3 байта и 1 бит ) нужно подать справа.
Проще кстати не сдвигать - а сделать новый массив из 16 байт.
manfeese
129 / 128 / 16
Регистрация: 04.01.2009
Сообщений: 415
23.11.2009, 11:24     Сдвиг 128-битного числа #6
Вот циклический сдвиг
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream.h>
#include <conio.h>
 
using namespace std;
 
enum TShiftState {Left=0,Right};
void StringShift (char *S, int StringSize, int bits, TShiftState SState)
{
 int Carr1=0,Carr2=0;
 
 if (SState)
 {
  //========== Сдвиг впарво ===========
  for (int j = 0; j < bits; j++)
  {
    Carr2=0;
    for (int i = 0; i < StringSize-1; i++)
    {
      (S[i] & 1) == 1 ? Carr1 = 0x80 : Carr1 = 0;
      S[i]>>=1;
         if ( (S[i] & 0x80) == 0) S[i]+=Carr2;
         else if (Carr2==0) S[i]+=0x80;
      Carr2=Carr1;
    }
     if ( (S[0] & 0x80) == 0) S[0]+=Carr2;
     else if (Carr2==0) S[0]+=0x80;
  }
  //===================================
 }
 else
 {
  //=========== Сдвиг влево ===========
  for (int j = 0; j < bits; j++)
  {
    Carr2=0;
    for (int i = StringSize-2; i >=0; i--)
    {
      (S[i] & 0x80) == 0x80 ? Carr1 = 1 : Carr1 = 0;
      S[i]<<=1;
      S[i]+=Carr2;
      Carr2=Carr1;
    }
      S[StringSize-2]+=Carr2;
  }
  //===================================
 }
}
 
int main()
{
    char S[] = "0123456789abcdef";              //  строка любых значений
    StringShift(S,sizeof(S),(sizeof(S)-1)*8,Left);
    cout<<S;
 
    getch();
    return 0;
}
rosin
0 / 0 / 0
Регистрация: 22.09.2009
Сообщений: 21
23.11.2009, 19:02  [ТС]     Сдвиг 128-битного числа #7
Так я не понял:на сколько бит функция сдвигает строку.
manfeese
129 / 128 / 16
Регистрация: 04.01.2009
Сообщений: 415
23.11.2009, 20:09     Сдвиг 128-битного числа #8
на сколько укажешь
Код
void StringShift (char *S, int StringSize, int bits, TShiftState SState)
S - строка, StringSize - размер строки. Сдвиг осуществляеться на количество bits бит в направлении указанном переменной SState (Left=0, Right=1)
rosin
0 / 0 / 0
Регистрация: 22.09.2009
Сообщений: 21
23.11.2009, 22:57  [ТС]     Сдвиг 128-битного числа #9
Я имею ввиду вторую реализацию(с циклическим сдвигом).При вызове функции в 3-ем параметре ты указываешь (sizeof(S)-1)*8.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2009, 23:04     Сдвиг 128-битного числа
Еще ссылки по теме:

Вычисление факториала 20-битного числа C++
C++ Циклический сдвиг последних 3 цифр числа
Сдвиг числа вправо C++
C++ Эмуляция 128-битного типа
Циклический сдвиг числа C++

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

Или воспользуйтесь поиском по форуму:
manfeese
129 / 128 / 16
Регистрация: 04.01.2009
Сообщений: 415
23.11.2009, 23:04     Сдвиг 128-битного числа #10
Цитата Сообщение от rosin Посмотреть сообщение
При вызове функции в 3-ем параметре ты указываешь (sizeof(S)-1)*8
Это я проверял максимальное количество сдвигов. Если строка состоит из 4 символов (фактически 5: "\0" тоже считается), то максимальное количество сдвигов будет 4*8=32 или (5-1)*8=32. При этом значении строка должна стать равна начальной. А вместо него вводи обычное число сдвигов.
Yandex
Объявления
23.11.2009, 23:04     Сдвиг 128-битного числа
Ответ Создать тему
Опции темы

Текущее время: 11:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru