До меня не доходит правильное решение. Или тема раскрыта криво или Правильное решение от разработчиков некорректно составлено?
Где в правильном решении от разработчиков строка: int result = 2; которая заложена в условии? Почему там return 1 << power; и где вообще в правильном решении фигурирует цифра 2, которая нам дана по условию задачи? и как в этой задаче реализуется логика из объяснения в лекции: "16 = это 2^4. Значит нужно сдвинуть число на 4 разряда влево"? Но ведь если мы 16 сдвинем на четыре разряда влево (т.е. 1 0000 сдвинуть на четыре разряда влево будет 1 0000 0000 что действительно так и есть), а согласно этой логике, 2 в 3-ей степени = 8, значит число нужно сдвинуть на три разряда? Но тогда 0010 сдвигаем на 3 разряда и получаем 1 000, а это уже 16 в десятичной системе. Но мы-то знаем, что 2 в 3 степени будет 8... И в чем тут правда? Объясните, пожалуйста, логику, которая приводится в лекции?
Вадим З.
33 уровень
Правильное решение от разработчиков некорректного составлено?
Решен
Комментарии (17)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
ГоффMaster
4 октября 2024, 22:16
В х-ной системе счисление сдвиг цифр влево всегда будет умножением на x.
В 10-чной сдвигая цифры влево и добавляя справа 0 ты умножаешь на 10. В двоичной - на 2.
0
Денис Enterprise Java Developer
3 августа 2024, 08:12
Обсуждать код без кода глупо, но в общем и целом сдвиг единицы на N раз влево и есть ответ этой задачи.
Если ты вспомнишь арифметику, то любое число в нулевой степени - единица, потому если power будет ноль (т.е. без сдвига) единицу тебе и нужно вернуть, даже учитывая что возводишь в степень ты двойку. Ну а дальше все просто.
0001 <- 1 = 0010 (2)
0001 <- 2 = 0100 (4)
Ну и так далее. Фактически сдвиг влево это умножение на два, вправо - деление. Возьми например 101 (5) сдвинь его на разряд влево и получишь 1010 (10). Такое вот свойство двоичной системы счисления.
0
Вадим З.
3 августа 2024, 09:57
Прошу прощения - может быть не очень точно сформулировал вопрос. Вопрос касается не моего кода, а кода приведённого в правильном решении от разработчиков. Вот сам код, выложенный как правильное решение от разработчиков:
Теперь повторю вопрос:
Так вот я не нашёл Где в правильном решении от разработчиков строка: int result = 2; которая заложена в условии? Ее там просто нет. Почему там return 1, а не 2 << power; и где вообще в правильном решении фигурирует цифра 2, которая нам дана по условию задачи? ну и логика, для чего нам в лекции рассказывали про то, что четвёртая степень-это сдвинуть четыре бита, если к условию задачи это нельзя применить, так как два в третьей степени сдвинутая на 3 бита бита будет никак не 8, а 16?
Логичнее было бы объяснение такое же как, из твоего примера из школьной программы: мы знаем, что любое число в первой степени будет само число, следовательно дальше каждое увеличение степени на 1 - просто сдвиг на одно значение влево. Т.е. 2^3 = 0010 (это два в первой степени) и сдвиг на два значения (т.е. вторая степень - это справа добавляем 0 и в третьей степени справа добавляется ещё 1 ноль, т.е. прибавилось два нуля и стало 01000). Значит возведение result в степень power будет result < (power - 1), а не сдвиг на power
0
Денис Enterprise Java Developer
3 августа 2024, 10:41
Ну ты тогда уже и условие приложи ) Я то его не вижу.
Почему там return 1 я описал в предыдущем сообщении, прочитай его внимательно. Равно как и почему в правильном решении не нужна цифра 2. Любое число в первой степени конечно же само это число, но почему ты забываешь что степень бывает и нулевая?) ведь если код возводит в какую-то степень он же в любую степень возводит, а не в "избранные" :) Да, в рамках этой задачи не рассматриваются отрицательные степени, это вызвано ограничением типа данных и тонкостями работы с дробями в вычислительной технике. Но возвести именно двойку в достаточно большую степень больше или равную нулю совершенно не сложно посредством битового сдвига.
Это не логика, это банальная и скучная математика.
0
Вадим З.
3 августа 2024, 11:32
Пардон, вот условие задачи:
Реализуй метод getPowerOfTwo(int power), который возвращает число 2 в степени power.
Тебе нужно изменить реализацию метода getPowerOfTwo(int), используя соответствующий побитовый сдвиг.
ну и дальше код, который нужно исправить:
Напомню: к условию у меня вопросов или недопонимания нет. И задачу я решил
0
Денис Enterprise Java Developer
3 августа 2024, 11:56
Если ты о строчке "возвращает число 2 в степени power" это не значит что тебе надо в коде где-то иметь int something = 2;
0
Вадим З.
3 августа 2024, 12:32
Это требуется по условию задачи. Из школьной программы мы помним, что число x в степени n равно х перемнтженное на себя n раз. Как это "не значит что тебе надо в коде где-то иметь int something = 2"? А если, к примеру, будет не 2, а функция Scanner cs = new Scanner(System.in);?
0
Денис Enterprise Java Developer
3 августа 2024, 13:15
Ну вот и вспомни школьную программу. Нулевая степень любого числа чему равна?
0
Вадим З.
3 августа 2024, 13:49
Равна 1, Но этот пример подходит только к конкретной цифре два. Обрати внимание на решение от разработчиков:
к твоему примеру подходит идеально, если мы берём 2 и возводим в любую степень. Но если будет не 2, а допустим 5 (0101) и power будет допустим 2... 5 во 2-й степени будет 25, в двоичной системе 11001.. или три во второй степени? да в общем любое число кроме двойки. как тут применить сдвиг?
0
Денис Enterprise Java Developer
3 августа 2024, 15:28
Кажись я понял что тебя смущает :) Смотри, битовый сдвиг влево сам по себе не возводит в степень ничего, он просто умножает число на два (я об этом писал еще в первом своём ответе).
Потому если речь идёт о двойке как основании просто пользуются этим свойством :) Ну т.е. двойка умноженная на двойку это ж степень двойки? а еще раз умноженная на двойку? следующая степень двойки. Потому не мудрствуя лукаво берут единицу как точку отсчёта (нулевая степень - нулевой сдвиг), и сдвигают ее влево на нужное количество разрядов.
Ну и так далее
Но конечно же ни с каким основанием КРОМЕ двойки этот фокус не пройдёт.
+5
Вадим З.
4 августа 2024, 04:46
Вот! Теперь стало понятно. Спасибо!
0
Вадим З.
4 августа 2024, 04:53
Однако, чтобы окончательно закрыть для себя эту тему, может быть ты объяснишь мне еще один момент из лекции, но не из задачи:
почему 0b00000011 << 20 = 0b001100000000000000000000?
ну, т.е. Я понимаю, что в данном случае мы сдвигаем число типа int, но где тут указано, что это именно int, а не byte, short, или long?
и почему тогда:
0b11000011 >> 20 = 0b00000000, а не 0b000000000000000000001100?
0
Денис Enterprise Java Developer
4 августа 2024, 08:51
Тут я тебе сильно не подскажу, очень похоже что под капотом происходит расширение типа до int (но не более).
Сдвиг за пределы выделенного диапазона очевидно должен обнулять значение, если он этого не делает, значит это как-то хендлится на уровне языка. Вот можно с таким кодом поиграться:
Как видишь, сама операция выполняется нормально, ну т.е. идет расширение до int.
Если попытаться сохранить результат в byte очевидно мы потеряем информацию безвозвратно.
Свыше int тип не расширяется, если ты сделаешь сдвиг на 33 бита (больше чем доступные 32, то фактически получаешь 6-ку (3 * 2, твоё искомое число один раз сдвинулось влево), можно еще поиграться и понять что сдвиг при выходе за диапазон фактически происходит по формуле N % 32 где N это требуемый сдвиг, а 32 это максимальное количество битов в типе int.
Но почему именно так я тебе ответить не могу, тут скорее доки нужно читать если интересно.
0
Вадим З.
4 августа 2024, 10:14
Хорошо. Спасибо. В любом случае сильно выручил.
0
Anton
4 октября 2024, 22:10
читаю весь вечер, не пойму, а почему тогда ответ 64,ведь 1<<6 дает такой результат, а в задаче сверху указано power(3).......неужели все так просто... System.out.println(getPowerOfTwo(3));
что two(3) это 6?????
0
hidden #3303140
5 октября 2024, 07:00
Задача - написать реализацию метода, который возводит двойку в степень. Он будет возводить в любую степень, хоть в 3, хоть в 6, хоть в 20.
В зависимости от того, с каким параметром его вызвать, такой результат и получишь.
0
Денис Enterprise Java Developer
5 октября 2024, 07:55
Ничего не понял, но очень интересно
0