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

Сдвиги - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.71
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.01.2010, 16:06     Сдвиги #1
Необходимо сдвинуть массив беззнаковых целых чисел, как единое число. Обычные сдвиги и циклические ...
Подскажите, пожалуйста

Добавлено через 20 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void wshr(WORD32 * X, int s, int size)
{
    WORD32 t = 0, c = 0;
    for(int i = 0; i < size; i++)
    {
        t       = X[i];
        X[i]    = (t >> s) | c;
        c       = (t << (BITSONWORD - s));
    }
}
void wshl(WORD32 * X, int s, int size)
{
    WORD32 t = 0, c = 0;
    for(int i = size; i > 0; i--)
    {
        t = X[i-1];
        X[i-1] = (t << s) | c;
        c = (t >> (BITSONWORD - s));
    }
}
Написал такие, но они двигают только при значениях сдвига от 1 до 31 ))..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2010, 16:06     Сдвиги
Посмотрите здесь:

битовые сдвиги C++
Циклические сдвиги C++
Сдвиги. (<< и >>) C++
Побитовые сдвиги C++
C++ циклические сдвиги
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
29.01.2010, 17:31     Сдвиги #2
Например берем s==32 и функцию wshl()
i= size.
t= X[size-1]
X[i-1]= (t<<32) | 0;

И что мы имеем при t<<32 ?
Будет 0.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.01.2010, 17:37  [ТС]     Сдвиги #3
Цитата Сообщение от odip Посмотреть сообщение
И что мы имеем при t<<32 ?
Я не понял, что имеется в виду.
Ведь если на 32 двигать, то первое слово как раз и обнулится.
К тому же я сказал, что они не корректны, просто идея... прошу помощи )..
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
29.01.2010, 18:15     Сдвиги #4
мож это?
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
58
59
60
61
62
63
64
65
66
// Циклический сдвиг одномерного массива или строки
 
// итак, нужно преобразовать массив ab в bа. 
// Предположим, что у нас есть функция reverse, 
// переставляющая элементы некоторой части массива в 
// противоположном порядке. В исходном состоянии массив имеет 
// вид ab. Вызвав эту функцию для первой части, получим аrb 
// (прим. редактора:аr - это модифицированная часть a, к которой 
// применили фукнцию перестановки reverse). Затем вызовем ее для 
// второй части: получим аrbr. Затем вызовем функцию для всего 
// массива, что даст (аrbr)r, а это в точности соответствует bа. 
// Посмотрим, как будет такая функция действовать на массив abcdefgh, 
// который нужно сдвинуть влево на три элемента:
// псевдокод: Сдвиг через функцию перестановки reverse   ссылка
// reverse(0, i-1)   /* cba|defgh */
// reverse(i, n-1)   /* cba|hgfed */
// reverse(0, n-1)   /* defgh|abc */
 
#include <iostream>
#include <time.h>
 
 
#define   randomize() srand(time(NULL))
#define   SIZE        10
 
using namespace std;
void Reverse(int *begin, int *end)
{ 
    int temp;
    while (end>begin)
    {
        temp = *begin;
        *begin = *end;
        *end = temp;
        begin++; end--;
    }
} // end Reverse
 
int main()
{
    int A[SIZE];
    int i;
 
    for (i=SIZE; --i>=0;)
        A[i]=i; //rand()%10;
 
    cout<<"A"<<endl;     /// вывод
    for (i=0; i<SIZE; i++)
        cout<<A[i]<<' ';
    cout<<endl;
 
    //////////////////////////////////////////////////////////////////////////
    // сам циклический сдвиг на i элементов
    cout<<"number shift: "; cin>>i;
    Reverse(&A[0], &A[i-1]);
    Reverse(&A[i], &A[SIZE-1]);
    Reverse(&A[0], &A[SIZE-1]);
    //////////////////////////////////////////////////////////////////////////
 
    cout<<"revA"<<endl;     /// вывод
    for (i=0; i<SIZE; i++)
        cout<<A[i]<<' ';
 
    cout<<endl; system("PAUSE");
    return 0;
} // end main
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.01.2010, 20:13  [ТС]     Сдвиги #5
Цитата Сообщение от TanT Посмотреть сообщение
мож это?
Сдвиг нужен битовый.
Такой алгоритм подойдет, если заиметь реверс битов только нужной части числа.

Добавлено через 33 минуты
Поправил битовый сдвиг вправо, влево будет аналогичен, но что-то коряво как-то смотрится

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void wshr(WORD32 * X, int s, int size)
{
    WORD32 t = 0, c = 0;
    for(int i = 0; i < size; i++)
    {
        t       = X[i];
        X[i]    = (t >> s) | c;
        c       = (t << (BITSONWORD - s));
    }
}
 
void _wshr(WORD32 * X, int s, int size)
{
    WORD32 * T = new WORD32[size];
    memset(T, 0, size);
    for(int i = s/BITSONWORD, j = 0; i < size; i++, j++)
    {
        T[i] = X[j];
    }
    wshr(T, s%BITSONWORD, size);
    wcpy(X, T, size); // копирование массивов
    delete[] T;
}
Вот пример использования (сдвиг на 36 бит) и результат
C++
1
2
WORD32 x[] = { 0x12345678, 0xabcdefff, 0xa1b2c3d4 };
_wshr(x, 36, 3);
Код
HEX - 00000000 001234567 8ABCDEFF
BIN - 0000 0000 0000 0000 0000 0000 0000 0000
0000 0001 0010 0011 0100 0101 0110 0111
1000 1010 1011 1100 1101 1110 1111 1111
Теперь можно начинать разбираться с циклическими сдвигами
Yandex
Объявления
29.01.2010, 20:13     Сдвиги
Ответ Создать тему
Опции темы

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