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

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

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

Как работают побитовые сдвиги? - C++

13.04.2007, 19:36. Просмотров 37910. Ответов 42
Метки нет (Все метки)

Люди объясните плиз как работают побитовые сдвиги
<< и >>, а то что то совсем запарился :confused:
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2007, 19:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как работают побитовые сдвиги? (C++):

Побитовые сдвиги - C++
Был на собеседовании, была задачка, вроде такая: Есть функция, которая принимает char a (1 байт) Нужно определить количество битов,...

Побитовые сдвиги - C++
#include&lt;iostream&gt; int main() { int t=1; while(255&amp;t){ t=t&lt;&lt;t; std::cout&lt;&lt;t&lt;&lt;'\n';} ...

Побитовые сдвиги - C++
нужна помощь с заданием на С++: При написании функций можно использовать только следующее: - целочисленные константы; - целочисленные...

Не работают побитовые операции с++ - C++
Использую Microsoft Visual Studio 2012 Express Этот код компилируется, но в переменную с записывается a&amp;&amp;b: #include &lt;iostream&gt; ...

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

Побитовые операции (программа, которая интерпретирует старшие 3 бита как некоторое число n...) - C++
Уважаемые форумчане, нужна ваша помощь. Нужно составить программу, которая интерпретирует старшие 3 бита как некоторое число n и...

42
fakel15
24 / 23 / 1
Регистрация: 03.03.2007
Сообщений: 4
14.04.2007, 16:00 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Все банально просто...
val << n - это сдвиг влево переменной val на n разрядов. то же самое что умножение на 2 в определенной степени.
пример:
int val = 4;
int temp = val << 3;
в результате temp=32. по другому это val*(2^3);

val >> n - это сдвиг вправо переменной val на n разрядов. то же самое что деление на 2 в определенной степени.
пример:
int val = 4;
int temp = val >> 2;
в результате temp=1. по другому это val/(2^2);

Вот в принципе и все...
Желаю удачи
23
Rich
11 / 11 / 1
Регистрация: 16.03.2007
Сообщений: 107
15.04.2007, 13:17 #3
Скачай книгу про C++. Вот цитата из рукодовства:
Операции сдвига << и >> группируют слева направо. Обе выполняют
одно обычное арифметическое преобразование над своими операндами,
каждый из которых должен быть целым. В этом случае правый операнд
преобразуется к типу int; тип результата совпадает с типом левого
операнда. Результат неопределен, если правый операнд отрицателен
или больше или равен длине объекта в битах.

- стр 270 -

сдвиговое_выражение:
выражение << выражение
выражение >> выражение
Значением Е1 << Е2 является Е1 (рассматриваемое как битовое
представление), сдвинутое влево на Е2 битов; освободившиеся биты
заполняются нулями. Значением Е1 >> Е2 является Е1 , сдвинутое
вправо на Е2 битовых позиций. Гарантируется, что сдвиг вправо
является логическим (заполнение нулями), если Е1 является unsigned;
в противном случае он может быть арифметичевким (заполнение копией
знакового бита).
0
broDiaga_cpp
23 / 13 / 1
Регистрация: 20.02.2010
Сообщений: 181
03.09.2013, 19:59 #4
А можно ли как-то получить старший сдвинутый бит при побитовом сдвиге влево?
Т.е. есть число 1001001
применяем операцию сдвига влево на 1 бит какой-то функцией my_func_shift(int a)
получаем 0010010, но функция возвращает сдвинутый старший бит единицу.
Есть такая функция в плюсах?
0
Kuzia domovenok
2117 / 1946 / 190
Регистрация: 25.03.2012
Сообщений: 6,750
Записей в блоге: 1
03.09.2013, 20:05 #5
тема старая.
нафига тебе получать этот бит?
А если сдвиг не на 1 влево, а на 2,3...n?
Не легче отдельной операцией получить старшие биты, сдвинув исходное число на n-1 вправо?
0
broDiaga_cpp
23 / 13 / 1
Регистрация: 20.02.2010
Сообщений: 181
03.09.2013, 20:10 #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
нафига тебе получать этот бит?
Какая разница? Необходимо.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
А если сдвиг не на 1 влево, а на 2,3...n?
Требуется только на 1 бит.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Не легче отдельной операцией получить старшие биты, сдвинув исходное число на n-1 вправо?
Нецелесообразно с точки зрения производительности.
0
Kuzia domovenok
2117 / 1946 / 190
Регистрация: 25.03.2012
Сообщений: 6,750
Записей в блоге: 1
03.09.2013, 20:28 #7
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Нецелесообразно с точки зрения производительности.
Какой ещё производительности? Ты не о производительности думай!
Короче, ответ: нет.
0
ValeryS
Модератор
6749 / 5158 / 493
Регистрация: 14.02.2011
Сообщений: 17,335
03.09.2013, 20:36 #8
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Есть такая функция в плюсах?
нет
но можно сделать
C++
1
2
3
4
5
6
7
int Myfunc(int & aa)
{
 unsigned int tmp=0x80000000&aa;// выделяем старший бит
 aa=aa<<1;// сдвиг
 tmp>>=31;//старший бит загоняем в младший
return tmp; 
}
1
broDiaga_cpp
23 / 13 / 1
Регистрация: 20.02.2010
Сообщений: 181
03.09.2013, 20:43 #9
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Какой ещё производительности? Ты не о производительности думай!
Если бы речь шла о лабе в институте - я бы согласился, что плевать на производительность. Но речь идёт не о лабе и на счету каждая миллисекунда.
0
ValeryS
Модератор
6749 / 5158 / 493
Регистрация: 14.02.2011
Сообщений: 17,335
03.09.2013, 20:56 #10
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Но речь идёт не о лабе и на счету каждая миллисекунда.
за одну миллисекунду пройдут тысячи операций
и кто тебе сказал что винда "система реального времени"
1
zer0mail
2393 / 2025 / 201
Регистрация: 03.07.2012
Сообщений: 7,343
Записей в блоге: 1
03.09.2013, 22:13 #11
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Если бы речь шла о лабе в институте - я бы согласился, что плевать на производительность. Но речь идёт не о лабе и на счету каждая миллисекунда.
А если "дорога каждая миллисекунда" - делай ассемблерную вставку/процедуру с циклическим сдвигом или с использованием флажка процессора.
0
design_m
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 166
26.12.2017, 20:35 #12
Если надо установить биты 7-0 RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8 регистра UCSRB

C
1
UCSRB=(1<<RXEN)|( 1<<TXEN); //Включаем прием и передачу по USART
Только непонятно, если надо биты RXEN и TXEN установить в единицу, то исходя из определения операции побитового сдвига, 1 сдвигается влево на содержимое данных битов.
И каким образом тогда значение регистра становится равным сумме этих сдвигов, тоже не совсем понятно, обьясните, пожалуйста, в чем тут дело?

(то есть то, что эта операция их устанавливает в 1, это точно известно,т.к. везде так написано. И программа с таким текстом работает. Но нигде не могу найти обьяснения, как это выводится из правил операции побитового сдвига)

Добавлено через 14 минут
то есть понятно, что если эти биты равны 0, то 1 как раз в них и установится, а если нет? Она ведь сьедет в другой бит тогда, а может быть его значение не нужно менять?
А ведь операция предварительного обнуления этих битов не была записана, т.е. мы надеемся, что после RESET они нулевые?
А ведь есть некоторые биты, значения которых по дефолту как раз "1".

Обьясните мне пожалуйста эту хитрость.

Добавлено через 1 минуту
я имел в виду биты
C
1
RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8
регистра UCSRB

Добавлено через 5 минут
то есть почему просто не пишут в таком случае:
C++ (Qt)
1
UCSRB |= 0x00011000
ведь в таком случае только эти биты изменят свое значение на 1, а осталные не поменяют свое значение?
0
Sklifosofsky
685 / 621 / 155
Регистрация: 29.09.2015
Сообщений: 756
26.12.2017, 20:47 #13
Чесн, не знаком с таким интерфейсом.
RXEN и TXEN имеют постоянные значения?
В рамках какого числа живет UCSRB (...,8,16,32,... бит) ?

Цитата Сообщение от design_m Посмотреть сообщение
UCSRB |= 0x00011000
В первом примере у вас UCSRB принимающее, а тут... создается впечатление, что оно имеет какое то уже значение и вы пытаетесь выполнить побитовое сложение с ним
0
Kuzia domovenok
2117 / 1946 / 190
Регистрация: 25.03.2012
Сообщений: 6,750
Записей в блоге: 1
26.12.2017, 20:56 #14
Цитата Сообщение от design_m Посмотреть сообщение
то есть почему просто не пишут в таком случае:
UCSRB |= 0x00011000
потому что 0x00011000 число шестнадцатиричное, а не двоичное, как бы тебе хотелось.
ты имел в виду UCSRB |= 0x18
design_m, а какая разница так или так?
C++
1
2
UCSRB |= 0x18;
UCSRB=(1<<RXEN)|( 1<<TXEN);
в чём вопрос-то? посчитай на бумажке значение (1<<RXEN)|( 1<<TXEN) и как раз получишь 0x18
0
TRam_
471 / 477 / 124
Регистрация: 14.05.2017
Сообщений: 1,609
26.12.2017, 21:08 #15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
0x00011000
Двоичные числа во многих компиляторах записываются как
C++
1
0b00011000
но стандартом это не поддерживается и считается дурным тоном. Хорошим считается 16-ричное представление.
0
26.12.2017, 21:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2017, 21:08
Привет! Вот еще темы с ответами:

Сдвиги - C++
Необходимо сдвинуть массив беззнаковых целых чисел, как единое число. Обычные сдвиги и циклические ... Подскажите, пожалуйста :) ...

Сдвиги (С++) - C++
Создать функцию, которая позволяет в заданном диапазоне натуральных чисел найти и выдать на экран те числа, в двоичном представлении...

Сдвиги. (<< и >>) - C++
Всем привет, подскажите плз, насчёт сдвигов, а то я чилал в инете и что то ничего не понял. Вот например какой будет результат? int x =...

циклические сдвиги - C++
Как организовать циклический сдвиг числа? Например у меня есть число 5. В двоичной системе это выглядит как 0101, и мне нужно сделать так...


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

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

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