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

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

Восстановить пароль Регистрация
 
MartinSeptim
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 19
28.01.2014, 19:27     Битовый сдвиг массива #1
Помогите разобраться с сдвигом влево (выравниванием до начала байта) данных. Задача заключается в том что есть некий массив, в котором сдвинуты на 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;
        }
Но это решение неверно сдвигает данные. В чем моя ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2014, 19:27     Битовый сдвиг массива
Посмотрите здесь:

C++ Побитовый сдвиг массива
C++ циклический сдвиг массива
сдвиг массива C++
Циклический сдвиг массива без использования вспомогательного массива C++
C++ Битовый сдвиг
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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;
        }
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,170
Завершенные тесты: 1
28.01.2014, 20:05     Битовый сдвиг массива #3
вместо char Используйте int (char занимает всего один байт).
А конечный результат потом приводите к char.
MartinSeptim
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 19
28.01.2014, 20:16  [ТС]     Битовый сдвиг массива #4
Спасибо, но я немного не понимаю как это поможет?
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,170
Завершенные тесты: 1
28.01.2014, 20:37     Битовый сдвиг массива #5
Цитата Сообщение от MartinSeptim Посмотреть сообщение
не понимаю как это поможет?
При сдвиге восьмибитового char разряды выходят за границы байта и пропадают,
а в int - 4 байта, разряды останутся.
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. Можно ли каким-то образом инвертировать порядок бит в байте?
Yandex
Объявления
28.01.2014, 20:47     Битовый сдвиг массива
Ответ Создать тему
Опции темы

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