PDA

View Full Version : Binary Addition


DaNYer
Nov 22, 2003, 05:16
vot. mojet komu prigoditsya. 4 bit adder. mojno eshe i carry vinesti, no eto delo texniki.... zamenite void na int i return carry v konce dobac'te :) vot vam i full adder.


void addAB(int A[], int B[])
{
int next, i, carry=0;

for (i=3; i>=0; i--)
{
next = 1;
if (A[i]==0 && B[i]==0) //00 case -
{
A[i]= carry;
carry = 0;
next = 0;
} // good.

if (next)
if (A[i]==0 && B[i]==1) //01 case - transfer
{
if (carry == 0)
A[i] =1;
else
A[i]=0;
next = 0;
}

if(next)
if (A[i]==1 && B[i]==0) //10 case - transfer
{
if (carry == 0)
A[i] =1;
else
A[i]=0;
next = 0;
}

if(next)
if (A[i]==1 && B[i]==1) //11 case - generate
{
if (carry == 0)
{
A[i] =0;
carry = 1;
}
else
A[i]=0;
next = 0;
}
}
}

DaNYer
Nov 22, 2003, 05:19
a vot topornaya versiya binary multiplication:
(ya osobo ne zadumivalsya tak chto cod ves'ma priblizitel'nii, i podlejit optimizacii.)


#include <stdio.h>
#include <stdlib.h>

void load(int[], int[], int[]);
void display(int[], int[], int[]);
void compute(int[], int[], int[]);
void addAB(int[], int[]);

void main()
{
int AReg [4];
int BReg [4]; //Multiplicand
int QReg [4]; //Multiplier

load(AReg, QReg, BReg); //initialising registers with data

printf(" A Q B\n"); //page title

display(AReg, QReg, BReg); //general display

//computation first step
compute(AReg, QReg, BReg); //compute 1st bit
display(AReg, QReg, BReg); //display

compute(AReg, QReg, BReg); //compute 2nd bit
display(AReg, QReg, BReg); //display

compute(AReg, QReg, BReg); //compute 3rd bit
display(AReg, QReg, BReg); //display

compute(AReg, QReg, BReg); //compute 4th bit
display(AReg, QReg, BReg); //display

}


void compute(int AR[], int QR[], int BR[])
{
//allways testing QR[3]. if it is 0 - just shift A and Q right
if(QR[3] == 0)
{
printf("\t\t\t\t\t\tQR[3] == 0; shifting...\n");
QR[3] = QR[2];
QR[2] = QR[1];
QR[1] = QR[0];
QR[0] = AR[3];
AR[3] = AR[2];
AR[2] = AR[1];
AR[1] = AR[0];
AR[0] = 0;
}
else
{
printf("\t\t\t\t\t\tQR[3] == 1; Performig add A + B\n");

addAB(AR, BR);

printf("\t\t\t\t\t\tThen shifting...\n");
QR[3] = QR[2];
QR[2] = QR[1];
QR[1] = QR[0];
QR[0] = AR[3];
AR[3] = AR[2];
AR[2] = AR[1];
AR[1] = AR[0];
AR[0] = 0;
}
}


void addAB(int A[], int B[])
{
int next, i, carry=0;

for (i=3; i>=0; i--)
{
next = 1;
if (A[i]==0 && B[i]==0) //00 case -
{
A[i]= carry;
carry = 0;
next = 0;
} // good.

if (next)
if (A[i]==0 && B[i]==1) //01 case - transfer
{
if (carry == 0)
A[i] =1;
else
A[i]=0;
next = 0;
}

if(next)
if (A[i]==1 && B[i]==0) //10 case - transfer
{
if (carry == 0)
A[i] =1;
else
A[i]=0;
next = 0;
}

if(next)
if (A[i]==1 && B[i]==1) //11 case - generate
{
if (carry == 0)
{
A[i] =0;
carry = 1;
}
else
A[i]=1;
next = 0;
}
}
}


void display(int AR[], int QR[], int BR[])
{
int i;
printf(" ");
for(i=0; i<=3; i++)
printf(" %d", AR[i]);
printf("\t");
for(i=0; i<=3; i++)
printf(" %d", QR[i]);
printf("\t ");
for(i=0; i<=3; i++)
printf(" %d", BR[i]);
printf("\n");
}


//function to load registers with data.
void load(int AR[], int QR[], int BR[])
{
AR[0] = 0;
AR[1] = 0;
AR[2] = 0;
AR[3] = 0;

QR[0] = 0;
QR[1] = 1;
QR[2] = 0;
QR[3] = 0;

BR[0] = 0;
BR[1] = 0;
BR[2] = 1;
BR[3] = 0;
}

Фича
Nov 22, 2003, 10:44
разбор полета:
1. зачем переменная next? - if... else... else...else заменяет этот неуклюжий код...

Originally posted by DaNYer

void addAB(int A[], int B[])
{
int next, i, carry=0;

for (i=3; i>=0; i--)
{
next = 1;
if (A[i]==0 && B[i]==0) //00 case -
{
A[i]= carry;
carry = 0;
next = 0;
} // good.

if (next)
if (A[i]==0 && B[i]==1) //01 case - transfer
{
//заменить A[i] = 1 - carry;
if (carry == 0)
A[i] =1;
else
A[i]=0;
next = 0;
}

if(next)
if (A[i]==1 && B[i]==0) //10 case - transfer
{
//заменить A[i] = 1 - carry;
if (carry == 0)
A[i] =1;
else
A[i]=0;
next = 0;
}

if(next)
if (A[i]==1 && B[i]==1) //11 case - generate
{
//заменить на A[i] = carry; carry = 1. Так как проверка условий занимает больше тактов, чем простое присвоение
if (carry == 0)
{
A[i] =0;
carry = 1;
}
else
A[i]=0; Тут вообще ошибка...
next = 0;
}
}
}


по-человечески n - битный сумматор

int Add(const int * pA, const int * pB, int * pC, const int iSize)
{
//pA и pB имеют размер iSize. pC имеет размер iSize + 1. Отмечу, кроме того, что, если одно число короче другого, то оно до длинны наиболее длинного Padded with zeroes.
bool bCarry = false;
for (int i = 0; i < iSize; ++i)
{
pC[i] = pA[i] + pB[i] + bCarry;
bCarry = pC[i] > 1;
pC[i] &= 1;
}
pC[i] = bCarry;
return iSize + bCarry;
}

Фича
Nov 22, 2003, 10:51
умножение не стоит даже разбора так как почему - то у тебя регистры A Б и Кью одного размера, тогда как Кью должен был быть в два раза больше, значит программка не работает.... :)

DaNYer
Nov 22, 2003, 16:55
Originally posted by Фича
умножение не стоит даже разбора так как почему - то у тебя регистры A Б и Кью одного размера, тогда как Кью должен был быть в два раза больше, значит программка не работает.... :)


rabotaet :), trust me :) mojesh daje skompilirovat' i posmotret' esli ne len'.

prejde chem kritikovat' nado vnimatel'no izuchit' to chto kritikuesh. a ot tebya uskol'znul nemalovajnii fakt chto rezul'tat zapisivaetsya ne v odin a v dvas registra (A i Q), chto rovno v 2 raza bol'she chem A, soglasis'?

naschet addera, ne volnuisya, ya znaiu texnologiyu if-else, i peremennaya next prosto reshaet koe kakuiu problemu. krome togo kod pisalsya iskluchitel'no dlya predostavleniya ego v bezrazdel'noe pol'zovanie cheloveku kotoromu pozarez nujna bila eta proga. THE CODE IS NOT REFINED. ya prosto ne nashel nichego podobnogo na internete i bistren'ko napisal etu shtuchku sam.

DaNYer
Nov 23, 2003, 02:40
vo:

3)

A Q B
-----------------------------------------
0 0 0 0 0 1 1 1 0 1 1 0
-----------------------------------------
QR[3] == 1; Performig add A + B
Then shifting...
0 0 1 1 0 0 1 1 0 1 1 0
QR[3] == 1; Performig add A + B
Then shifting...
0 1 0 0 1 0 0 1 0 1 1 0
QR[3] == 1; Performig add A + B
Then shifting...
0 1 0 1 0 1 0 0 0 1 1 0
QR[3] == 0; shifting...
0 0 1 0 1 0 1 0 0 1 1 0


RESULT: 0110 x 0111 = 00101010

Press any key to continue

Фича
Nov 23, 2003, 11:05
anyway, такой код, как в сумматоре не делает вам чести :) :)

DaNYer
Nov 23, 2003, 13:13
Originally posted by Фича
anyway, такой код, как в сумматоре не делает вам чести :) :)

a mne :tutuz:. glavnoe chto rabotaet. a pobeditelei ne sudyat :)

Фича
Nov 23, 2003, 13:46
ну ну... вперед и с флагом в руках! :)

DaNYer
Nov 23, 2003, 13:50
nu da:)

Multiplication ya sdelal, Booth's Mult. Alg. toje sdelal... teper' delo za division i mojno sdavat' project v expluataciyu.

Фича
Nov 24, 2003, 05:32
Для суммирования предложил иную реализацию в вашей реализации алгоритма Бута... ;)
А для лучшего написания программ, посоветовал бы вам собрать соответствующие схемы и смоделировать их... :)

DaNYer
Nov 24, 2003, 05:44
Originally posted by Фича
Для суммирования предложил иную реализацию в вашей реализации алгоритма Бута... ;)
А для лучшего написания программ, посоветовал бы вам собрать соответствующие схемы и смоделировать их... :)

radi boga davai na "ti" a? :)

bol'shoe spasibo za pomosh, eto mne ponadobitsya v dal'neishem :)

analyst
Nov 27, 2003, 07:51
d

analyst
Nov 27, 2003, 07:53
[QUOTE]

void addAB(int A[], int B[])
{
int next, i, carry=0;

for (i=3; i>=0; i--)
{
next = 1;
if (A[i]==0 && B[i]==0) //00 case -
{
A[i]= carry;
carry = 0;
next = 0;
} // good.

if (next)
if (A[i]==0 && B[i]==1) //01 case - transfer
{
if (carry == 0)
A[i] =1;
else
A[i]=0;
next = 0;
}

if(next)
if (A[i]==1 && B[i]==0) //10 case - transfer
{
if (carry == 0)
A[i] =1;
else
A[i]=0;
next = 0;
}

if(next)
if (A[i]==1 && B[i]==1) //11 case - generate
{
if (carry == 0)
{
A[i] =0;
carry = 1;
}
else
A[i]=0;
next = 0;
}
}
}


А не было бы лучше если использовать case вместо if
??
и еще, вместо того чтоб проверять значения элементов можно было б просуммировать эти самые элементы и ставить case на три случая суммы (их всего три - 0, 1, 2)