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

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

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

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

16.11.2012, 16:25. Просмотров 313. Ответов 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++
C++ В чем может быть ошибка, и как её вылечить?
C++ В чем может быть ошибка?
C++ В чём может быть ошибка?
В чем может быть ошибка? (передача аргументов функции) C++
C++ Чем может быть чревато создание в классе адреса на другой класс
C++ В чем может быть ошибка. Расстояние между вершинами дерева
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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     В чем может быть ошибка? (пример с побитовым сдвигом)
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
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