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

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

Войти
Регистрация
Восстановить пароль
 
MartinSeptim
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 19
#1

Битовый сдвиг массива - C++

28.01.2014, 19:27. Просмотров 1298. Ответов 5
Метки нет (Все метки)

Помогите разобраться с сдвигом влево (выравниванием до начала байта) данных. Задача заключается в том что есть некий массив, в котором сдвинуты на n (где n не больше 7 включительно) бит. Эти данные нужно выровнять до начала байта. Т.е. допустим есть сдвинутые на 1 бит: 0111 1011 0000 0000- 7B из которых нужно получить F6 - 1111 0110 0000 000... т.е. перенести из следующего байта 1 (или n )бит в предыдущий. Как лучше это сделать? Мое решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char * bitShift (char * memblockSource, int bit) {
 
            char bytes;
            char temp = '0';
            for (int i = size; i>0; i--)
            {
                bytes = memblockSource[i-1];
                char result = bytes << bit;
                char temp_val = ((result + temp) & 0xFF);
                temp = result >> 8;
                memblockDest[i-1] = temp_val;
 
            }
 
            return memblockDest;
        }
Но это решение неверно сдвигает данные. В чем моя ошибка?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2014, 19:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Битовый сдвиг массива (C++):

Битовый сдвиг в if() - C++
Обясните как работает такой код:void swap(int &amp;a, int &amp;b) { int temp = a; a = b; b = temp; } void...

Битовый сдвиг - C++
Вот в чем вопрос: int x = 2; int y; y = (x &gt;&gt; 32); cout &lt;&lt; x &lt;&lt; &quot; &quot; &lt;&lt; y; Должен быть выход 2 0, а на экран...

Битовый сдвиг вправо для дробных чисел - C++
(Как мне уже известно) битовый сдвиг вправо на одну &quot;ячейку&quot; аналогичен делению на 2. Например 1/2^3 или 1&gt;&gt;3. Число получается не целым,...

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

Удаление элемента из массива и сдвиг массива - C++
Нужно удалить максимальный элемент массива и сделать сдвиг массива на одну позицию. Нужно сделать без использования vector и динамических...

сдвиг массива - C++
сдвинуть все элементы массива влево так что бы на первой позиции оказался минимальный элемент при этом использовать дополнительные...

5
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
28.01.2014, 19:57 #2
не уверен что это Вам нужен:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char * bitShift (char * memblockSource, int bit) {
 
            int ch;
            char *memblockDest;
            memblockDest=(char*) malloc (sizeof(char)*size);
            for (int i = size; i>0; i--)
            {
               
                ch=memblockSource[i-1];
                ch+=bit;
                memblockDest[i-1]=ch;
            }
 
            return memblockDest;
        }
0
zss
Модератор
Эксперт С++
6531 / 6093 / 2007
Регистрация: 18.12.2011
Сообщений: 15,845
Завершенные тесты: 1
28.01.2014, 20:05 #3
вместо char Используйте int (char занимает всего один байт).
А конечный результат потом приводите к char.
0
MartinSeptim
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 19
28.01.2014, 20:16  [ТС] #4
Спасибо, но я немного не понимаю как это поможет?
0
zss
Модератор
Эксперт С++
6531 / 6093 / 2007
Регистрация: 18.12.2011
Сообщений: 15,845
Завершенные тесты: 1
28.01.2014, 20:37 #5
Цитата Сообщение от MartinSeptim Посмотреть сообщение
не понимаю как это поможет?
При сдвиге восьмибитового char разряды выходят за границы байта и пропадают,
а в int - 4 байта, разряды останутся.
0
MartinSeptim
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 19
28.01.2014, 20:47  [ТС] #6
Цитата Сообщение от zss Посмотреть сообщение
При сдвиге восьмибитового char разряды выходят за границы байта и пропадают,
а в int - 4 байта, разряды останутся.
Ок, теперь понял. Однако я придумал другой способ, в котором можно иcпользовать char: result = x1 xor ( x2 & F0). Но здесь у меня проблема в том что допустим x1: 0001 1101
x2: 1110 0011. Мне нужно из этой последовательности получить 1110 1110 ... Но (x2 & F0) выдает 1100 000, а надо 0000 0011. Можно ли каким-то образом инвертировать порядок бит в байте?
0
28.01.2014, 20:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2014, 20:47
Привет! Вот еще темы с ответами:

Циклический сдвиг массива - C++
задача: Осуществить циклический сдвиг элементов квадратной матрицы размерности MxN вправо на k элементов таким образом: элементы 1-й...

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

Сдвиг массива символов - C++
class G { public: char name; char maker; int num; int price; }; G A,B,C; G D; void third(){ int i;

Побитовый сдвиг массива - C++
Есть двумерный массив int massiv;Нужно сдвинуть первый элемент массива в конец, а все остальные соответственно вперед. В цикле это...


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

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

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