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

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

Войти
Регистрация
Восстановить пароль
 
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
#1

В чем может быть ошибка? (пример с побитовым сдвигом) - C++

16.11.2012, 16:25. Просмотров 322. Ответов 8
Метки нет (Все метки)

Всем доброго дня)

В одной из книжек по С++ (Horton) наткнулся на такую вот небольшую задачку:

C++
1
2
3
unsigned s = 555;
int i = (s >> 4) & ~(~0 << 3);
cout << i;
Дескать, не компилируя, посчитайте, какое число выведет программа?
Я посчитал:
1. ~(~0 << 3) будет 7 (инвертируем ноль, сдвигаем на 3 единицы влево, (типа умножаем на 8), опять инвертируем значение операнда - в результате имеем бинарные 111 или десятичную 7).
2. 255 (бинарная 11111111) при сдвиге вправо дает 15 (или 1111).
3. 15 & 7 = 7

Т.е. на выходе получаем 7. Скомпилировал - программа выводит 2. What the fuck? Ничего не понимаю, в чем ошибся?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2012, 16:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В чем может быть ошибка? (пример с побитовым сдвигом) (C++):

В чем может быть ошибка? - C++
Вот программа: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;stdlib.h&gt; #include...

В чем может быть ошибка, и как её вылечить? - C++
Проблема такая. Покуда я студент, то пичкают нас всяческой дрянью, и вот настал язык Си. С С++ я знаком, и ноутбук с никсами прекрасно...

В чем может быть ошибка? (передача аргументов функции) - C++
Есть двумерный массив, симулирующий игровое поле (0 означают пустоту, 8 игрок) Есть некая функция, которую я хочу использовать просто для...

В чем может быть ошибка. Расстояние между вершинами дерева - C++
Входные данные: Первая строка содержит количество вершин в дереве n(1&lt;=n&lt;=500000). Вершины имеют значения от 0 до n-1. В следующих n-1...

Программа не работает на русском языке. В чем может быть ошибка? - C++
#include&lt;iostream&gt; #include &lt;string&gt; using namespace std; int main() { setlocale (LC_ALL, &quot;rus&quot;); for (int countinue = 0;...

Программа не работает, но ошибок не выдает. В чем может быть ошибка? - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;cstdlib&gt; #define m 8 using namespace std; int main() { int...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.11.2012, 16:31 #2
Цитата Сообщение от Excogit8er Посмотреть сообщение
~(~0 << 3) будет 7
Нет.
sizeof (int)=1: ~=255, 255<<3=248,
sizeof (int)=2: ~=65535, 65535<<3=65528,
0
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
16.11.2012, 16:31 #3
Цитата Сообщение от Excogit8er Посмотреть сообщение
255 (бинарная 11111111) при сдвиге вправо дает 15 (или 1111).
откуда 255? там 555
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.11.2012, 16:32 #4
sizeof (int)=4: ~=4294967295, 4294967295<<3=4294967288.
0
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
16.11.2012, 16:33 #5
taras atavin, еще перед скобкой ~
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.11.2012, 16:34 #6
А 7 при сдвиге влево не получается в принципе не из чего, так как справа должны быть ноли, то есть число может быть только кратно степени двойки.
0
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
16.11.2012, 16:36  [ТС] #7
Цитата Сообщение от taras atavin Посмотреть сообщение
Нет.
sizeof (int)=1: ~=255, 255<<3=248,
sizeof (int)=2: ~=65535, 65535<<3=65528,
Все равно не пойму )) Почему? Попробовал скомпилировать такое выражение:
cout << ~(~0 << 3);
Выдает 7, все правильно.
0
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
16.11.2012, 16:39 #8
Цитата Сообщение от Excogit8er Посмотреть сообщение
~(~0 << 3) будет 7
taras atavin, тут правда 7.
1. 0
2. ~0 - 111..111
3. ~0 << 3 - 11...11000
4. ~(~0 << 3) - 00...00111
5. 00...00111 - 7

Добавлено через 1 минуту
Excogit8er, про вашу ошибку я уже выше написал. Вы числа перпутали
0
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
16.11.2012, 16:42  [ТС] #9
Цитата Сообщение от taras atavin Посмотреть сообщение
А 7 при сдвиге влево не получается в принципе не из чего, так как справа должны быть ноли, то есть число может быть только кратно степени двойки.
Имеем 0. То есть в бинарном виде:
0000 0000 0000 0000 0000 0000 0000 0000

Инвертируем (~):
1111 1111 1111 1111 1111 1111 1111 1111

Сдвигаем на 3 значения влево:
1111 1111 1111 1111 1111 1111 1111 1000

Опять инвертируем:
0000 0000 0000 0000 0000 0000 0000 0111

111 = 7



Что не так?

Добавлено через 2 минуты
Цитата Сообщение от I.M. Посмотреть сообщение
откуда 255? там 555
Блин. Точно. Спасибо. От жеж я балбесина...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2012, 16:42
Привет! Вот еще темы с ответами:

задание из книги стивен прата 6 издание глючит. в чем может быть ошибка - C++
собрал задачу, ставлю текстовый файл внутри программы, с цифровыми данными, а он не работает. файл сам рабочий, так как другая программа...

Неверный результат функции поиска младших битов побитовым сдвигом - C++
Может здесь дело в неявном приведении типов? Добавлено через 23 минуты Есть ф-ция, имеющая два параметра num(число) и...

Вылетает "strcpy_s", в чем может быть ошибка? - C++
Все перепробовал, по сути ошибки не должно быть, компилируется нормально, но только доходит до того места, сразу программа вылетает ...

Чем может быть чревато создание в классе адреса на другой класс - C++
Всем привет! Я решил не заморачиваться с наследованием, так как у меня каждый класс использует только свои узкоспециализированные...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.11.2012, 16:42
Ответ Создать тему
Опции темы

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