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

Как приведенный код выводит ближайшую степень двойки? Разобрать работу программы - C++

Восстановить пароль Регистрация
 
Live4Sky
6 / 1 / 1
Регистрация: 04.10.2013
Сообщений: 42
23.01.2014, 05:15     Как приведенный код выводит ближайшую степень двойки? Разобрать работу программы #1
C++
1
2
3
4
unsigned k ;
cin>>k;
for (--k;k&(k+1);k|=k+1);
cout<<++k;
вот есть программа?что она делает - я знаю(выводит ближайшую степень двойки).
что мне нужно? - как она это делает? ну т.е. прям пошагово..спасибо заранее
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2014, 05:15     Как приведенный код выводит ближайшую степень двойки? Разобрать работу программы
Посмотрите здесь:

Не могу до конца разобрать код программы C++
C++ Найти степень двойки
C++ Степень двойки
Максимальная степень двойки C++
степень двойки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TheDanger227
 Аватар для TheDanger227
6 / 6 / 1
Регистрация: 27.11.2012
Сообщений: 58
23.01.2014, 11:47     Как приведенный код выводит ближайшую степень двойки? Разобрать работу программы #2
отладчики для чего существуют?
MicM
 Аватар для MicM
820 / 487 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
23.01.2014, 13:07     Как приведенный код выводит ближайшую степень двойки? Разобрать работу программы #3
1) Цикл начинается с числа, на 1 меньшего, чем было введено, потому что, если уже была введена степень двойки, то программа должна именно её и вывести.
2) Цикл выполняется, пока результат конъюнкции данного числа с последующим - истина. Ложь будет только тогда, когда следующее число является степенью двойки, т. к. в двоичной его записи старший разряд равен 1, а все младшие - нулю.
3) Ну и шаг цикла - дизъюнкция числа с последующим числом, т. е. по сути, этим действием в двоичной записи результирующего числа младшие разряды заполняются единицами (ну по правилу дизъюнкции естественно).
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
23.01.2014, 13:09     Как приведенный код выводит ближайшую степень двойки? Разобрать работу программы #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Live4Sky Посмотреть сообщение
C++
1
2
3
4
unsigned k ;
cin>>k;
for (--k;k&(k+1);k|=k+1);
cout<<++k;
Данный код эквивалентен
C++
1
2
3
4
5
6
--k;
while( k&(k+1) ) // то есть, пока  k&(k+1) не равно нулю 
{
    k = k | (k+1);
}
++k;
Чтобы понять, что делает команда k = k | (k+1); попробуем вычислить для какого-то конкретного числа.
Пример
1 0 0 1 1 0 1 : k
1 0 0 1 1 1 0 : k + 1
1 0 0 1 1 1 1 : k | ( k + 1 )
Ещё пример
1 1 0 0 0 0 1 1 1 : k
1 1 0 0 0 1 0 0 0 : k + 1
1 1 0 0 0 1 1 1 1 : k | ( k + 1 )
Можете Вы заметить какую-нибудь закономерность? Если нет, можно попробовать ещё к.-н. значение k. Для этого потребуется вспомнить: 1) как складывать числа "столбиком", 2) что означает операция |
Live4Sky
6 / 1 / 1
Регистрация: 04.10.2013
Сообщений: 42
30.01.2014, 09:00  [ТС]     Как приведенный код выводит ближайшую степень двойки? Разобрать работу программы #5
Цитата Сообщение от TheDanger227 Посмотреть сообщение
отладчики для чего существуют?
даже и не знаю, что ответить.... скорее всего для отладки????
Yandex
Объявления
30.01.2014, 09:00     Как приведенный код выводит ближайшую степень двойки? Разобрать работу программы
Ответ Создать тему
Опции темы

Текущее время: 03:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru