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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 103, средняя оценка - 4.86
MSDev
0 / 0 / 0
Регистрация: 19.12.2009
Сообщений: 11
#1

Побитовый сдвиг - C++

29.12.2009, 06:20. Просмотров 13467. Ответов 11
Метки нет (Все метки)

есть допустим переменная

unsigned char data = 0b10111011;

Как можно сделать за 4 шага по битовый сдвиг на двух половинах

как видите она делится на 1011 1011 надо что бы сдвигалась левая и правая часть .


1 . 0101 0101

2. 0010 0010

3. 0001 0001

4. 0000 0000

вот так примерно.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2009, 06:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Побитовый сдвиг (C++):

Побитовый сдвиг - C++
#include <iostream> using namespace std; int main(int argc, char** argv) { int a,b,c,i; cin >>a; cin >>c; cin >>b; do...

Побитовый сдвиг - C++
Выполнение данного кода приравнивает asd к нулю. Хотя должно к единице, судя по моим вычислениям. char asd = 10 & 2 >> 1; 1010 ...

Побитовый сдвиг - C++
Столкнулся с проблемой. У меня есть ключ - 0x1A305B98 Из него я получаю параметр путем int parm = (0x1A305B98 >> 20) & 0x1F;// = 3 ...

Побитовый сдвиг - C++
Непонятна часть программы с 24 по 45 строку. Помогите разобраться, пожалуйста. #include <iostream> using namespace std; const int...

Побитовый сдвиг - C++
Добрый день, помогите пожалуйста с побитовым сдвигом вправо, не получается добиться верной работы, укажите на ошибку пожалуйста, спасибо! ...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
29.12.2009, 06:32 #2
не совсем понятно: вам за 4 операции надо сдвинуть в право каждую половину переменной на один бит?
0
MSDev
0 / 0 / 0
Регистрация: 19.12.2009
Сообщений: 11
29.12.2009, 06:52  [ТС] #3
Да,верно

Добавлено через 14 минут
В обще можно хотя бы толковую ссылку по битовым операциям в 2ичной системе
0
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
29.12.2009, 06:55 #4
C++
1
2
data=data>>1;
data=data&(0xF7);
вот в этой книжке много чего полезного, но каюсь, сам тока глянул, не читал осознанно: Алгоритмические трюки для программистов Генри Уоррен, мл. Издательский дом "Вильяме" Москва * Санкт-Петербург * Киев 2004
1
DrMcSheen
60 / 60 / 1
Регистрация: 25.05.2009
Сообщений: 521
29.12.2009, 07:17 #5
Цитата Сообщение от TanT Посмотреть сообщение
data=data&(0xF7)
а не 0х77 ?
я не в курсе, операция >> какой сдвиг выполняет?
0
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
29.12.2009, 07:38 #6
Цитата Сообщение от DrMcSheen Посмотреть сообщение
а не 0х77 ?
я не в курсе, операция >> какой сдвиг выполняет?
data&0xF7 - оставляет 4х левых бита без изменения, обнуляет первый с лева бит во второй (правой) половине и оставляет остальные биты этой половины без изменения.
если учесть что после сдвига на один бит влево самый левый бит равен 0, то можно и 0x77, но 0xF7 подчёкивает изменение только одного нужного бита.

>> - выполняет сдвиг вправо
0
DrMcSheen
60 / 60 / 1
Регистрация: 25.05.2009
Сообщений: 521
29.12.2009, 07:44 #7
Странно. Выполняется операция SAR. По идее, при входном значении с установленным старшим битом, после сдвига старший бит должен остаться установленным.
Т.е. при data = 1000 1000 в результате >> должно получиться 1100 0100.
Но почему-то он обнуляется.
Но всё равно, для надёжности, я бы рекомендовал использовать 0x77.
источник
0
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
29.12.2009, 07:50 #8
у нас беззнаковый тип.
для надёжности можно, хотя в данном случае не играет
0
DrMcSheen
60 / 60 / 1
Регистрация: 25.05.2009
Сообщений: 521
29.12.2009, 07:56 #9
Цитата Сообщение от TanT Посмотреть сообщение
у нас беззнаковый тип
да, не учёл
0
MSDev
0 / 0 / 0
Регистрация: 19.12.2009
Сообщений: 11
29.12.2009, 13:56  [ТС] #10
Чё то не могу понять как оно сдвигает


C
1
2
3
4
5
6
7
8
9
10
11
void main(void)
{
    unsigned char data = 11000011;
             int i;
    for(i = 0;i<4;i++)
    {
        printf("%d \n",(int)data);
        data=data>>1;
        data=data&(0xF7);
    }
}
Результат:

203
101
50
17

data&(0xF7); - и это операция вроде как я поня по битового сравнения , только вот зачем она присваивается дате. И если мне память не изменяет она означает если 00100000b 00100000b то вернет тру то есть если 1 стоит в 5 позиции.
0
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
29.12.2009, 14:11 #11
Цитата Сообщение от MSDev Посмотреть сообщение

data&(0xF7); - и это операция вроде как я поня по битового сравнения , только вот зачем она присваивается дате. И если мне память не изменяет она означает если 00100000b 00100000b то вернет тру то есть если 1 стоит в 5 позиции.
ты несколько спутал с &&, A&&B - вернёт тру, если выражения A и B тру.
& - логическое И, таблица истинности такова
1&1 = 1
1&0 = 0
0&1 = 0
0&0 = 0

data&(0xF7) - обнуляет 4ый справа бит
0
MSDev
0 / 0 / 0
Регистрация: 19.12.2009
Сообщений: 11
29.12.2009, 17:49  [ТС] #12
То есть эта операция делает

допустим data = 00111011

data&(0xF7)

вернет 00110011

Добавлено через 2 часа 35 минут
PORTA=PORTA>>1; - вот это простой сдвиг на 1 вправо верно ...

0001 0000
0000 1000
0000 0100
...

data&(0xF7) - а это в обще никак не могу понять...покажите пару итерация если не трудно и опишите подробнее...

Добавлено через 15 минут
все разобрался.Всем спасибо.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2009, 17:49
Привет! Вот еще темы с ответами:

Побитовый сдвиг влево и вправо - C++
Что выполнится быстрее - сдвиг влево или сдвиг вправо? И как замерить время выполнения каждой из операций в коде? Добавлено через 2...

Как происходит побитовый сдвиг? - C++
for(int i = 0; i &lt; 10; i ++){ if (i &amp; (1 &lt;&lt; j)) cout &lt;&lt; i &lt;&lt; endl; }

Как реализовать правильный побитовый сдвиг? - C++
Всем привет! У меня тупик в неожиданном месте) Я имею пару чаров и должен из них собрать int: char a1 = 224; char a2 = 18; ...

Не могу понять, как работает побитовый сдвиг - C++
Есть вот такой код: int invar, wv1, wv2, et, yt, resv; invar = 14; wv1 = invar &gt;&gt; 4; printf(&quot;%i\n&quot;, wv1); wv1 = wv1 &lt;&lt; 28; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.12.2009, 17:49
Ответ Создать тему
Опции темы

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