JaxTeller61 Ответов: 2

Как умножить два двоичных числа без оператора"*"?


How to multiply two binary numbers without " * " operator? In c rrogramming


Что я уже пробовал:

Я пишу эту программу для целочисленных значений.

#include<stdio.h>
/* function to multiply two numbers x and y*/
int multiply(int x, int y)
{
   /* 0  multiplied with anything gives 0 */
   if(y == 0)
     return 0;
 
   /* Add x one by one */
   if(y > 0 )
     return (x + multiply(x, y-1));
  
  /* the case where y is negative */
   if(y < 0 )
     return -multiply(x, -y);
}
 
int main()
{
  printf("\n %d", multiply(5, -11));
  getchar();
  return 0;
}

2 Ответов

Рейтинг:
16

OriginalGriff

Это зависит именно от того, что задается вашим домашним заданием: если вы должны написать multiply функция, которая не использует оператор умножения, то есть несколько способов, которыми вы могли бы подойти к этому:
1) грубая сила и невежество. Х * Y так же, как добавление х к само й раз:

x * 0 = 0
x * 1 = x
x * 2 = x + x
x * 3 = x + x + x
...
Итак, найдите наименьшее из двух чисел и повторите это множество раз, добавив другое к общему числу.
2) немного больше утонченности. Помните логарифмы? бревнон(x * y) = logн(x) + журналн(год)
Таким образом, вы можете использовать встроенные в C математические функции для ведения журнала10 x и y, добавьте затем, а затем анти-лог их, чтобы получить результат.
3) гораздо больше утонченности! Используйте битовый сдвиг и сложение в цикле для умножения. Целое число-это двоичное число, поэтому вы можете рассматривать каждый бит как множитель: Умножение и деление двоичных чисел | умножение и деление[^]- И число с 1 говорит вам, является ли наименьший значащий бит нулем или единицей, а два оператора сдвига << и >> умножают и делят на два.

Но... это твое домашнее задание, так что я не дам тебе никакого кода!


Afzaal Ahmad Zeeshan

Даже полезно для меня. 5ed.

Rahul VB

Часто задаваемый вопрос и идеальное решение.
Мои 5!

Рейтинг:
0

Patrice T

Извините за поздний ответ.
Когда вы учились делать умножения в начальной школе, вы должны были изучить этот эффективный алгоритм:

  456
 *123
-----
 1368
 912.
456..
-----
46088

он использует трюк, что умножение на 10 легко, вы просто сдвигаете цифры и добавляете ноль справа.
Просто так получилось, что этот алгоритм можно использовать для двоичного умножения, потому что процессоры знают, как сделать сдвиг на двоичных значениях.
Все что вам нужно это операторы bitwize: Побитовые операции в C-Википедии[^]
multiply by -1: 0-x
multiply by  2: x << 1
divide by 2: x >> 1
Check if unit is 0 or 1: x & 1