Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/78: Рейтинг темы: голосов - 78, средняя оценка - 4.55
MSDev
0 / 0 / 0
Регистрация: 19.12.2009
Сообщений: 11
1

Побитовый сдвиг

29.12.2009, 06:20. Просмотров 14246. Ответов 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
Ответы с готовыми решениями:

Побитовый сдвиг
Выполнение данного кода приравнивает asd к нулю. Хотя должно к единице, судя по...

Побитовый сдвиг
Непонятна часть программы с 24 по 45 строку. Помогите разобраться, пожалуйста....

Побитовый сдвиг
#include <iostream> using namespace std; int main(int argc, char** argv) {...

Побитовый сдвиг
Столкнулся с проблемой. У меня есть ключ - 0x1A305B98 Из него я получаю...

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

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

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

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

Побитовый сдвиг влево и вправо
Что выполнится быстрее - сдвиг влево или сдвиг вправо? И как замерить время...

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


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

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

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