Это зависит. Мы говорим о логической операции умножения или о том, как на самом деле это делается в аппаратном обеспечении?
Например, вы можете преобразовать шестнадцатеричную (или восьмеричную, или любой другой множитель с двумя основными) в целое число "без умножения ». Вы можете go символ за символом и продолжать ориентироваться (|
) и сдвигать биты (<<
). Это позволяет избежать использования оператора *
.
Делать то же самое с десятичными строками сложнее, но у нас все еще есть простое добавление. Вы можете использовать циклы с дополнением, чтобы сделать то же самое. Довольно просто сделать. Или вы можете создать свою собственную «таблицу умножения» - надеюсь, вы научились умножать числа в школе; Вы можете сделать то же самое с компьютером. И, конечно же, если вы работаете на десятичном компьютере (а не на двоичном), вы можете выполнить «битовое смещение», как и в предыдущей шестнадцатеричной строке. Даже с двоичным компьютером вы можете использовать серию битовых сдвигов - (a << 1) + (a << 3)
- это то же самое, что и a * 2 + a * 8 == a * 10
. Осторожнее с отрицательными числами. Вы можете придумать множество хитростей, чтобы сделать это интересным.
Конечно, оба они являются просто скрытым умножением. Это потому, что позиционные системы c * по своей сути мультипликативны . Вот как работает это конкретное представление цифр c. У вас могут быть упрощения, которые скрывают этот факт (например, двоичные числа нуждаются только в 0
и 1
, поэтому вместо умножения вы можете иметь простое условие - конечно, то, что вы на самом деле делаете, это все еще умножение, только с два возможных входа и два возможных выхода), но он всегда есть, скрывается. <<
совпадает с * 2
, даже если аппаратное обеспечение, которое выполняет операцию, может быть проще и / или быстрее.
Чтобы полностью отказаться от умножения, вам следует избегать использования позиционной системы. Например, римские цифры являются аддитивными (обратите внимание, что настоящие римские цифры не использовали правила компактификации, которые мы имеем сегодня - четыре будут IIII
, а не IV
, и четырнадцать могут быть записаны в любой форме, например XIIII
, IIIIX
, IIXII
, VVIIII
et c.). Преобразование такой строки в целое число становится очень простым - просто go символ за символом, и продолжайте добавлять. Если символ X
, добавьте десять. Если V
, добавьте пять. Если I
, добавьте один. Я надеюсь, вы понимаете, почему римские цифры так долго оставались популярными; Позиционные системы c замечательны, когда вам нужно много умножения и деления. Если вы в основном имеете дело с сложением и вычитанием, римские цифры работают отлично и требуют гораздо меньшего количества обучения (а счеты гораздо проще в создании и использовании, чем позиционный калькулятор!).
С такими заданиями, как это то, что на самом деле ожидает интервьюер. Может быть, они просто хотят увидеть ваши мыслительные процессы. Вы принимаете технические детали (<<
не является действительно умножением)? Знаете ли вы теорию чисел и информатику? Вы просто погружаетесь в свой код или просите разъяснений? Считаете ли вы это забавным испытанием или еще одним смешным скучным вопросом для собеседования, который не имеет никакого отношения к вашей работе? Мы не можем сказать вам ответ, который искал интервьюер.
Но я надеюсь, что, по крайней мере, вы мельком увидели возможных ответов :)