![]() |
![]() | #1 |
Banned Join Date: 10 2002 Location: Brooklyn, New York Age: 42
Posts: 3,760
Downloads: 0 Uploads: 0
Reputation: 0 | 0 | ![]()
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 ![]() 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: 10 2002 Location: Brooklyn, New York Age: 42
Posts: 3,760
Downloads: 0 Uploads: 0
Reputation: 0 | 0 | ![]()
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; 22.11.2003 at 21:51. |
![]() |
![]() | #3 | |
Младенец Join Date: 11 2003 Location: клитляндия
Posts: 39
Downloads: 0 Uploads: 0
Reputation: 0 | 0 | ![]()
разбор полета: 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; } | |
![]() |
![]() | #4 |
Младенец Join Date: 11 2003 Location: клитляндия
Posts: 39
Downloads: 0 Uploads: 0
Reputation: 0 | 0 | ![]()
умножение не стоит даже разбора так как почему - то у тебя регистры A Б и Кью одного размера, тогда как Кью должен был быть в два раза больше, значит программка не работает.... ![]() |
![]() |
![]() | #5 | |
Banned Join Date: 10 2002 Location: Brooklyn, New York Age: 42
Posts: 3,760
Downloads: 0 Uploads: 0
Reputation: 0 | 0 | ![]() Quote:
rabotaet ![]() ![]() 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: 10 2002 Location: Brooklyn, New York Age: 42
Posts: 3,760
Downloads: 0 Uploads: 0
Reputation: 0 | 0 | ![]()
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: 11 2003 Location: клитляндия
Posts: 39
Downloads: 0 Uploads: 0
Reputation: 0 | 0 | ![]()
Для суммирования предложил иную реализацию в вашей реализации алгоритма Бута... ![]() А для лучшего написания программ, посоветовал бы вам собрать соответствующие схемы и смоделировать их... ![]() |
![]() |
![]() | #12 | |
Banned Join Date: 10 2002 Location: Brooklyn, New York Age: 42
Posts: 3,760
Downloads: 0 Uploads: 0
Reputation: 0 | 0 | ![]() Quote:
![]() bol'shoe spasibo za pomosh, eto mne ponadobitsya v dal'neishem ![]() | |
![]() |
![]() | #14 |
скромный VIP Join Date: 06 2003 Location: Yerevan Age: 33
Posts: 960
Downloads: 0 Uploads: 0
Reputation: 0 | 0 | ![]()
[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) |
![]() |
Sponsored Links |