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

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

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

Сдвиги - C++

29.01.2010, 16:06. Просмотров 2342. Ответов 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 ))..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2010, 16:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сдвиги (C++):

Сдвиги (С++) - C++
Создать функцию, которая позволяет в заданном диапазоне натуральных чисел найти и выдать на экран те числа, в двоичном представлении...

Сдвиги. (<< и >>) - C++
Всем привет, подскажите плз, насчёт сдвигов, а то я чилал в инете и что то ничего не понял. Вот например какой будет результат? int x =...

Побитовые сдвиги - C++
#include&lt;iostream&gt; int main() { int t=1; while(255&amp;t){ t=t&lt;&lt;t; std::cout&lt;&lt;t&lt;&lt;'\n';} ...

циклические сдвиги - C++
Как организовать циклический сдвиг числа? Например у меня есть число 5. В двоичной системе это выглядит как 0101, и мне нужно сделать так...

Побитовые сдвиги - C++
Был на собеседовании, была задачка, вроде такая: Есть функция, которая принимает char a (1 байт) Нужно определить количество битов,...

Логические сдвиги - C++
Вводим число 'k', где k=2n. Должно вывести 'n'. Решить при помощи логических сдвигов.

4
odip
Эксперт С++
7159 / 3221 / 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.
0
fasked
Эксперт С++
4951 / 2531 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
29.01.2010, 17:37  [ТС] #3
Цитата Сообщение от odip Посмотреть сообщение
И что мы имеем при t<<32 ?
Я не понял, что имеется в виду.
Ведь если на 32 двигать, то первое слово как раз и обнулится.
К тому же я сказал, что они не корректны, просто идея... прошу помощи )..
0
TanT
эволюционирую потихоньку
466 / 464 / 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
1
fasked
Эксперт С++
4951 / 2531 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
Теперь можно начинать разбираться с циклическими сдвигами
0
29.01.2010, 20:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2010, 20:13
Привет! Вот еще темы с ответами:

Циклические сдвиги - C++
доброго времени суток, уважаемые форумчане. напишите пожалуйста код к задаче, от этого зависит получу ли я талон или нет: ...

битовые сдвиги - C++
как с помощью битовых сдвигов передвинуть разряды в шестнадцатеричном числе?

Побитовые сдвиги - C++
нужна помощь с заданием на С++: При написании функций можно использовать только следующее: - целочисленные константы; - целочисленные...

сдвиги. не прога, а вопрос - C++
Преподаватель задаёт всем такой вопрос, а я не пойму в чём подвох а=5 а&gt;&gt;10 а&lt;&lt;10 а=? а=5 а&lt;&lt;10 ...


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

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

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