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

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

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

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

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

Люди объясните плиз как работают побитовые сдвиги
<< и >>, а то что то совсем запарился :confused:
Лучшие ответы (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 и...

10
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
Сообщений: 108
15.04.2007, 13:17 #3
Скачай книгу про C++. Вот цитата из рукодовства:
Операции сдвига << и >> группируют слева направо. Обе выполняют
одно обычное арифметическое преобразование над своими операндами,
каждый из которых должен быть целым. В этом случае правый операнд
преобразуется к типу int; тип результата совпадает с типом левого
операнда. Результат неопределен, если правый операнд отрицателен
или больше или равен длине объекта в битах.

- стр 270 -

сдвиговое_выражение:
выражение << выражение
выражение >> выражение
Значением Е1 << Е2 является Е1 (рассматриваемое как битовое
представление), сдвинутое влево на Е2 битов; освободившиеся биты
заполняются нулями. Значением Е1 >> Е2 является Е1 , сдвинутое
вправо на Е2 битовых позиций. Гарантируется, что сдвиг вправо
является логическим (заполнение нулями), если Е1 является unsigned;
в противном случае он может быть арифметичевким (заполнение копией
знакового бита).
0
broDiaga_cpp
22 / 12 / 1
Регистрация: 20.02.2010
Сообщений: 181
03.09.2013, 19:59 #4
А можно ли как-то получить старший сдвинутый бит при побитовом сдвиге влево?
Т.е. есть число 1001001
применяем операцию сдвига влево на 1 бит какой-то функцией my_func_shift(int a)
получаем 0010010, но функция возвращает сдвинутый старший бит единицу.
Есть такая функция в плюсах?
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
03.09.2013, 20:05 #5
тема старая.
нафига тебе получать этот бит?
А если сдвиг не на 1 влево, а на 2,3...n?
Не легче отдельной операцией получить старшие биты, сдвинув исходное число на n-1 вправо?
0
broDiaga_cpp
22 / 12 / 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
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
03.09.2013, 20:28 #7
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Нецелесообразно с точки зрения производительности.
Какой ещё производительности? Ты не о производительности думай!
Короче, ответ: нет.
0
ValeryS
Модератор
6679 / 5088 / 476
Регистрация: 14.02.2011
Сообщений: 17,086
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
22 / 12 / 1
Регистрация: 20.02.2010
Сообщений: 181
03.09.2013, 20:43 #9
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Какой ещё производительности? Ты не о производительности думай!
Если бы речь шла о лабе в институте - я бы согласился, что плевать на производительность. Но речь идёт не о лабе и на счету каждая миллисекунда.
0
ValeryS
Модератор
6679 / 5088 / 476
Регистрация: 14.02.2011
Сообщений: 17,086
03.09.2013, 20:56 #10
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Но речь идёт не о лабе и на счету каждая миллисекунда.
за одну миллисекунду пройдут тысячи операций
и кто тебе сказал что винда "система реального времени"
1
zer0mail
2354 / 1984 / 198
Регистрация: 03.07.2012
Сообщений: 7,117
Записей в блоге: 1
03.09.2013, 22:13 #11
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Если бы речь шла о лабе в институте - я бы согласился, что плевать на производительность. Но речь идёт не о лабе и на счету каждая миллисекунда.
А если "дорога каждая миллисекунда" - делай ассемблерную вставку/процедуру с циклическим сдвигом или с использованием флажка процессора.
0
03.09.2013, 22:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2013, 22:13
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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