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

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

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

unsigned char data = 0b10111011;

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

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


1 . 0101 0101

2. 0010 0010

3. 0001 0001

4. 0000 0000

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

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

>> - выполняет сдвиг вправо
DrMcSheen
 Аватар для DrMcSheen
59 / 59 / 1
Регистрация: 25.05.2009
Сообщений: 521
29.12.2009, 07:44     Побитовый сдвиг #7
Странно. Выполняется операция SAR. По идее, при входном значении с установленным старшим битом, после сдвига старший бит должен остаться установленным.
Т.е. при data = 1000 1000 в результате >> должно получиться 1100 0100.
Но почему-то он обнуляется.
Но всё равно, для надёжности, я бы рекомендовал использовать 0x77.
источник
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
29.12.2009, 07:50     Побитовый сдвиг #8
у нас беззнаковый тип.
для надёжности можно, хотя в данном случае не играет
DrMcSheen
 Аватар для DrMcSheen
59 / 59 / 1
Регистрация: 25.05.2009
Сообщений: 521
29.12.2009, 07:56     Побитовый сдвиг #9
Цитата Сообщение от TanT Посмотреть сообщение
у нас беззнаковый тип
да, не учёл
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 позиции.
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 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ый справа бит
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2009, 17:49     Побитовый сдвиг
Еще ссылки по теме:

Не могу понять, как работает побитовый сдвиг C++
Побитовый сдвиг C++
Как происходит побитовый сдвиг? C++

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

Или воспользуйтесь поиском по форуму:
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 минут
все разобрался.Всем спасибо.
Yandex
Объявления
29.12.2009, 17:49     Побитовый сдвиг
Ответ Создать тему
Опции темы

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