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

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

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

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

16.11.2012, 16:25. Просмотров 318. Ответов 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? Ничего не понимаю, в чем ошибся?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2012, 16:25     В чем может быть ошибка? (пример с побитовым сдвигом)
Посмотрите здесь:

В чем может быть ошибка? - 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++
Может здесь дело в неявном приведении типов? Добавлено через 23 минуты Есть ф-ция, имеющая два параметра num(число) и...

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

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

Подскажите пожалуйста в чем может быть трабл при компиляции класса выдает ошибку - C++
Подскажите пожалуйста в чем может быть проблема: при компиляции класса выдает ошибку: (Ошибка LNK2001 неразрешенный внешний символ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
3569 / 1752 / 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,
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
16.11.2012, 16:31     В чем может быть ошибка? (пример с побитовым сдвигом) #3
Цитата Сообщение от Excogit8er Посмотреть сообщение
255 (бинарная 11111111) при сдвиге вправо дает 15 (или 1111).
откуда 255? там 555
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.11.2012, 16:32     В чем может быть ошибка? (пример с побитовым сдвигом) #4
sizeof (int)=4: ~=4294967295, 4294967295<<3=4294967288.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
16.11.2012, 16:33     В чем может быть ошибка? (пример с побитовым сдвигом) #5
taras atavin, еще перед скобкой ~
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.11.2012, 16:34     В чем может быть ошибка? (пример с побитовым сдвигом) #6
А 7 при сдвиге влево не получается в принципе не из чего, так как справа должны быть ноли, то есть число может быть только кратно степени двойки.
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, все правильно.
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, про вашу ошибку я уже выше написал. Вы числа перпутали
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2012, 16:42     В чем может быть ошибка? (пример с побитовым сдвигом)
Еще ссылки по теме:

В чём может быть ошибка? - C++
Не пойму в чём ошибка в программе: #include &lt;iostream&gt; using namespace std; int main( ) // Program that...

В чём может быть ошибка? - C++
Описать функцию Power4(x,a,ξ) вещественного типа (параметры х, а, ξ - вещественные, |х|&gt;1; a,ξ &gt; 0), находящую приближенное значение...

В чём может быть ошибка? - C++
Пишет, что нету точки с запятой. Где??? #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; { class Program ...

где может быть ошибка на с++ - C++
при подсчете sn через 5 членов цикл повторяется вот текст программы #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;math.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
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
Блин. Точно. Спасибо. От жеж я балбесина...
Yandex
Объявления
16.11.2012, 16:42     В чем может быть ошибка? (пример с побитовым сдвигом)
Ответ Создать тему
Опции темы

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