2016-10-29 5 views
-1

Программа C, которая вычисляет умножение и деление, используя вычитание и добавление для двоичных чисел.Двоичное умножение и разделение без «/» и «*»

* 2 дополнения.

Я должен написать этот код, но я полностью застрял в этом. Может ли кто-нибудь помочь мне с алгоритмом или шагами?

ответ

2

Умножение повторяется дополнение. Например, 3 x 7 - это три копии из семи добавленных вместе.

Аналогичным образом разделение повторяется вычитанием. Это количество раз, когда вы можете вычесть одно число из другого, пока не достигнете или не достигнете нуля.

Примером этого является 17/4:

17 - 4 = 13 (once) 
13 - 4 = 9 (twice) 
9 - 4 = 5 (thrice) 
5 - 4 = 1 (fource?) 
1 - 4 = -3 

Следовательно 17/4 равно 4, с остатком 1.

С точки зрения добавления и вычитания двоичных чисел, два дополнения фактически делают это проще, поскольку метод кодирования означает, что вы используете дополнение независимо от того, что.

Например, вот два примера добавляющие 5 и -5 10:

0000 1010 (10)  0000 1010 (10) 
0000 0101 (5)  1111 1101 (-5) 
--------------  -------------- 
0000 1111 (15)  0000 0111 (5) 

И, чтобы превратить положительное число в его отрицательный, вы просто инвертировать все biuts затем добавить 1.

Чтобы на самом деле добавить два двоичных чисел немного в то время, вы просто использовать правила, которые вы использовали, вы должны узнали в начальной школе/классе школы:

carry = 0 
for each bit position starting at right: 
    tempnum = carry + num1[position] + num2[position] 
    result[position] = tempnum modulo 2 
    carry = integer(tempnum/2) 
end for 
+1

Да, я знаю, что на самом деле это это первый вопрос. Но я застрял в реализации этого в двоичном коде. Как я могу это сделать? – JaxTeller61

+2

@ JaxTeller61: повторяю после меня: «нет такой вещи, как« двоичные числа ». Повторяйте, пока не поверите. («Binary» - это просто обозначение *!) – usr2564301

2

Умножение только добавляет и то же значение несколько раз. Отдел просто вычитает одно и то же значение несколько раз, пока у вас ничего не останется. Рассмотрите этот код ниже, а затем подумайте о том, что вам нужно сделать, чтобы он работал для отрицательных чисел.

int multiply(int a, int b) 
{ 
    int result = 0; 
    while(b > 0) 
    { 
     result += a; 
     b--; 
    } 

    return result; 
} 

int divide(int a, int b) 
{ 
    int result = 0; 
    while (a >= b) 
    { 
     result++; 
     a = a - b; 
    } 
    return result; 
} 


int main(){ 
    printf("100/3 = %d\n",divide(100,3)); 
    printf("3*9 = %d\n",multiply(3,9)); 
} 
+0

Okey Это хорошо для нормального целого числа, например. но для двоичных кодов? может ли использовать ту же логику? – JaxTeller61

+1

Что значит «двоичные коды». Отправьте пример объявления переменной и назначения двоичного кода.Вышеприведенный код будет работать как двоичный, как divide (7,3), такой же: divide (0b111,0b011); –

+0

Я пытаюсь сказать, что пользователь будет вводить «101001» и «110011», например. Не целое значение. И ı должен умножать и делить с помощью этих значений «101001» и «110011» – JaxTeller61

0

Самый эффективный способ умножить на число - добавить смещение их в двоичной форме. Итак, если вы хотите умножить на 10, что в двоичной форме равно 1010, вы заметите, что есть 1 в позиции 3 (основано на 0) и один в позиции 1 , поэтому, если вы хотите умножить n * 10 = n < < 3 + п < < 1 это то, что использует людей для быстрого преобразования строк в числа , например:

void fs_int(int *x) { 
register int c = getchar(); 
*x = 0; 
int neg = 0; 

for(; ((c<48 || c>57) && c != '-'); c = getchar()); 

if(c=='-') { 
    neg = 1; 
    c = getchar(); 
} 

for(; c>47 && c<58 ; c = getchar()) { 
    *x = (*x<<1) + (*x<<3) + c - 48; 
} 

if(neg) 
    *x = -(*x); 
} 

о подразделениях Я также заинтересован в ответ ...

+0

Двоичный номер обязательно должен быть прочитан назад, конечно! – jurhas

Смежные вопросы