Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/14: Рейтинг темы: голосов - 14, средняя оценка - 4.93
Эксперт С++
4252 / 2226 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
1

Поразрядные операторы сдвига

27.08.2011, 11:03. Просмотров 2889. Ответов 5
Метки нет (Все метки)

Всем хорошо известно, что поразрядные операторы сдвига >> и << сдвигают все биты переменной вправо или влево. Во время сдвига битов в один конец числа, другой конец заполняется нулями (ограничимся рассмотрением переменных без знака). Данные сдвиги не являются циклическими.

Так вот столкнулся с ситуацией, что если n - количество разрядов переменной, например x, то
x << (n - 1 + i) == x << i,
где 0 < i < n. Например,

unsigned long x;
x = 1 << 32; ( == 1 << 1)
x = 1 << 33; ( == 1 << 2)

Казалось бы, что переменная x во всех случаях должна быть равна 0, но нет, совсем нет.
Кто-нибудь знает почему это так и где это прописано? Можно написать формулу:
unsigned long x = 1 << n; (== 1 << (n % (sizeof(x)*8)));

Со сдвигом вправо таких странностей нет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.08.2011, 11:03
Ответы с готовыми решениями:

Поразрядные операторы,операторы сдвига
#include&lt;iostream&gt; using namespace std; int bitcount(unsigned x) { int b;...

Поразрядные операторы
Здравствуйте, объясните мне практическую ценность поразрядных операторов, не могу понять, зачем они...

Поразрядные операторы + небольшая шифропрограммка
Начинаю изучать поразрядные операторы (и, или, исключающее или, не). В принципе все понятно, но...

Поразрядные операторы
Здравствуйте! Начал изучать язык JAVA. Читаю книгу &quot;JAVA руководство для начинающих. Пятое...

5
Эксперт С++
2122 / 1560 / 232
Регистрация: 29.05.2011
Сообщений: 3,238
27.08.2011, 11:26 2
Цитата Сообщение от Thinker Посмотреть сообщение
unsigned long x;
x = 1 << 32; ( == 1 << 1)
x = 1 << 33; ( == 1 << 2)
Первый раз слышу. Что за компилятор? Можно маленький, но законченный пример кода?
0
2818 / 1628 / 252
Регистрация: 03.12.2007
Сообщений: 4,223
27.08.2011, 11:27 3
Стандарт C++:
http://www.open-std.org/jtc1/s... expr.shift
The operands shall be of integral or enumeration type and integral
promotions are performed. The type of the result is that of the pro-
moted left operand. The behavior is undefined if the right operand is
negative, or greater than or equal to the length in bits of the pro-
moted left operand.
Так что может быть что угодно. Размер непосредственного операнда у инструкций сдвига - 8 бит, так что, видимо, компилятор так и компилит сдвиг на 33 (или при вычислении константы сдвигает). Далее описание инструкций:
http://www.intel.com/content/d... manual.pdf
The destination operand can be a register or a memory location. The count operand
can be an immediate value or the CL register. The count is masked to 5 bits (or 6 bits
if in 64-bit mode and REX.W is used). The count range is limited to 0 to 31 (or 63 if
64-bit mode and REX.W is used). A special opcode encoding is provided for a count
of 1.
А вообще компилятор должен бы warning давать при таком.
2
Эксперт С++
4252 / 2226 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.08.2011, 11:39  [ТС] 4
Цитата Сообщение от grizlik78 Посмотреть сообщение
Первый раз слышу. Что за компилятор? Можно маленький, но законченный пример кода?
Такой глюк на acmp есть, голову ломал почему некоторые тесты не проходят, а дело в этом оказалось. Компилятор тут не причем, раз на одном глючит, то и на другом тоже так может быть. Но вот такая интересная особенность, никогда не думал, что такие ловушки могут быть.

Можно и код:
C++
1
2
unsigned long x = 1 << 100;
std::cout << x;
На экране: 16
0
Эксперт С++
2122 / 1560 / 232
Регистрация: 29.05.2011
Сообщений: 3,238
27.08.2011, 11:43 5
Ну что ж, остаётся только согласиться, что это UB и не использовать такой код.
0
Эксперт С++
4252 / 2226 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.08.2011, 11:50  [ТС] 6
Цитата Сообщение от Somebody Посмотреть сообщение
А вообще компилятор должен бы warning давать при таком.
Сдвиг зависел от значения переменной.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.08.2011, 11:50

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Поразрядные операторы
Только начинаю изучать csharp по книге Герберта Шилдта, но не могу понять действие поразрядных...

Поразрядные операторы
Добрый день! Помогите пожалуйста с такой проблемкой... Хочу изучить С# ,разбираю Шилдта и никак не...

Поразрядные операторы - их суть и назначение
Господа, подскажите пожалуйста, что делают поразрядные операторы, если можно, то пожалуйста на...

Операторы сдвига
Возник вопрос, в javascript есть такой оператор как a &gt;&gt;&gt; b он Как сделать тоже самое с...


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

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

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