![]() | |
| |||||||
| Home | Register | Blogs | FAQ | Members List | Calendar | Downloads | Arcade | Mark Forums Read |
| Algorithms The source of algorithms for your project |
![]() |
| | LinkBack | Thread Tools | Display Modes |
| | #1 |
| Banned Join Date: Oct 2002 Location: Brooklyn, New York
Posts: 3,760
Rep Power: 0 Reputation:
10 | Binary Addition 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.Code: 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;
}
}
} |
| | |
| | #2 |
| Banned Join Date: Oct 2002 Location: Brooklyn, New York
Posts: 3,760
Rep Power: 0 Reputation:
10 | a vot topornaya versiya binary multiplication: (ya osobo ne zadumivalsya tak chto cod ves'ma priblizitel'nii, i podlejit optimizacii.) Code: #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;
} Last edited by DaNYer : Nov 22, 2003 at 21:51. |
| | |
| | #3 | |
| Младенец Join Date: Nov 2003 Location: клитляндия
Posts: 39
Rep Power: 0 Reputation:
10 | Re: Binary Addition разбор полета: 1. зачем переменная next? - if... else... else...else заменяет этот неуклюжий код... Quote:
Code: 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;
}
__________________ pictores veneficiosque futuo | |
| | |
| | #4 |
| Младенец Join Date: Nov 2003 Location: клитляндия
Posts: 39
Rep Power: 0 Reputation:
10 | умножение не стоит даже разбора так как почему - то у тебя регистры A Б и Кью одного размера, тогда как Кью должен был быть в два раза больше, значит программка не работает.... ![]()
__________________ pictores veneficiosque futuo |
| | |
| | #5 | |
| Banned Join Date: Oct 2002 Location: Brooklyn, New York
Posts: 3,760
Rep Power: 0 Reputation:
10 | Quote:
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. | |
| | |
| | #6 |
| Banned Join Date: Oct 2002 Location: Brooklyn, New York
Posts: 3,760
Rep Power: 0 Reputation:
10 | vo: Code: 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 |
| | |
| | #11 |
| Младенец Join Date: Nov 2003 Location: клитляндия
Posts: 39
Rep Power: 0 Reputation:
10 | Для суммирования предложил иную реализацию в вашей реализации алгоритма Бута... ![]() А для лучшего написания программ, посоветовал бы вам собрать соответствующие схемы и смоделировать их... ![]()
__________________ pictores veneficiosque futuo |
| | |
| | #12 | |
| Banned Join Date: Oct 2002 Location: Brooklyn, New York
Posts: 3,760
Rep Power: 0 Reputation:
10 | Quote:
![]() bol'shoe spasibo za pomosh, eto mne ponadobitsya v dal'neishem ![]() | |
| | |
| | #14 |
| скромный VIP Join Date: Jun 2003 Location: Yerevan
Posts: 960
Rep Power: 6 Reputation:
10 | Re: Binary Addition [quote] Code: 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 на три случая суммы (их всего три - 0, 1, 2)
__________________ И аткуда такие беруцца??? |
| | |