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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.71
fasked
Эксперт C++
 Аватар для fasked
4929 / 2509 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
#1

Сдвиги - C++

29.01.2010, 16:06. Просмотров 2185. Ответов 4
Метки нет (Все метки)

Необходимо сдвинуть массив беззнаковых целых чисел, как единое число. Обычные сдвиги и циклические ...
Подскажите, пожалуйста

Добавлено через 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++
C++ циклические сдвиги
C++ Побитовые сдвиги
C++ Циклические сдвиги массива
Логические сдвиги C++
C++ Сдвиги (С++)
Регистры, сдвиги и массивы C++
Побитовые сдвиги C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт С++
 Аватар для odip
7151 / 3291 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
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
4929 / 2509 / 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
4929 / 2509 / 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     Сдвиги
Ответ Создать тему
Опции темы

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