 |
Binary Addition |
 |
22.11.2003, 05:16
|
#1
|
Banned
Join Date: 10 2002
Location: Brooklyn, New York
Age: 47
Posts: 3,760
Rep Power: 0
|
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;
}
}
}
|
|
|
 |
|
 |
22.11.2003, 05:19
|
#2
|
Banned
Join Date: 10 2002
Location: Brooklyn, New York
Age: 47
Posts: 3,760
Rep Power: 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.
|
|
|
 |
 |
Re: Binary Addition |
 |
22.11.2003, 10:44
|
#3
|
Младенец
Join Date: 11 2003
Location: клитляндия
Posts: 39
Rep Power: 0
|
Re: Binary Addition
разбор полета:
1. зачем переменная next? - if... else... else...else заменяет этот неуклюжий код...
Quote:
Originally posted by DaNYer
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
{
//заменить 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 - битный сумматор
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
|
|
|
 |
22.11.2003, 10:51
|
#4
|
Младенец
Join Date: 11 2003
Location: клитляндия
Posts: 39
Rep Power: 0
|
умножение не стоит даже разбора так как почему - то у тебя регистры A Б и Кью одного размера, тогда как Кью должен был быть в два раза больше, значит программка не работает....
__________________
pictores veneficiosque futuo
|
|
|
22.11.2003, 16:55
|
#5
|
Banned
Join Date: 10 2002
Location: Brooklyn, New York
Age: 47
Posts: 3,760
Rep Power: 0
|
Quote:
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.
|
|
|
23.11.2003, 02:40
|
#6
|
Banned
Join Date: 10 2002
Location: Brooklyn, New York
Age: 47
Posts: 3,760
Rep Power: 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
|
|
|
23.11.2003, 11:05
|
#7
|
Младенец
Join Date: 11 2003
Location: клитляндия
Posts: 39
Rep Power: 0
|
anyway, такой код, как в сумматоре не делает вам чести
__________________
pictores veneficiosque futuo
|
|
|
23.11.2003, 13:13
|
#8
|
Banned
Join Date: 10 2002
Location: Brooklyn, New York
Age: 47
Posts: 3,760
Rep Power: 0
|
Quote:
Originally posted by Фича
anyway, такой код, как в сумматоре не делает вам чести
|
a mne  . glavnoe chto rabotaet. a pobeditelei ne sudyat
|
|
|
23.11.2003, 13:46
|
#9
|
Младенец
Join Date: 11 2003
Location: клитляндия
Posts: 39
Rep Power: 0
|
ну ну... вперед и с флагом в руках!
__________________
pictores veneficiosque futuo
|
|
|
23.11.2003, 13:50
|
#10
|
Banned
Join Date: 10 2002
Location: Brooklyn, New York
Age: 47
Posts: 3,760
Rep Power: 0
|
nu da
Multiplication ya sdelal, Booth's Mult. Alg. toje sdelal... teper' delo za division i mojno sdavat' project v expluataciyu.
|
|
|
24.11.2003, 05:32
|
#11
|
Младенец
Join Date: 11 2003
Location: клитляндия
Posts: 39
Rep Power: 0
|
Для суммирования предложил иную реализацию в вашей реализации алгоритма Бута... 
А для лучшего написания программ, посоветовал бы вам собрать соответствующие схемы и смоделировать их...
__________________
pictores veneficiosque futuo
|
|
|
24.11.2003, 05:44
|
#12
|
Banned
Join Date: 10 2002
Location: Brooklyn, New York
Age: 47
Posts: 3,760
Rep Power: 0
|
Quote:
Originally posted by Фича
Для суммирования предложил иную реализацию в вашей реализации алгоритма Бута... 
А для лучшего написания программ, посоветовал бы вам собрать соответствующие схемы и смоделировать их...
|
radi boga davai na "ti" a?
bol'shoe spasibo za pomosh, eto mne ponadobitsya v dal'neishem
|
|
|
27.11.2003, 07:51
|
#13
|
скромный VIP
Join Date: 06 2003
Location: Yerevan
Age: 38
Posts: 960
Rep Power: 0
|
d
__________________
И аткуда такие беруцца???
|
|
|
 |
Re: Binary Addition |
 |
27.11.2003, 07:53
|
#14
|
скромный VIP
Join Date: 06 2003
Location: Yerevan
Age: 38
Posts: 960
Rep Power: 0
|
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 вместо if
??
и еще, вместо того чтоб проверять значения элементов можно было б просуммировать эти самые элементы и ставить case на три случая суммы (их всего три - 0, 1, 2)
__________________
И аткуда такие беруцца???
|
|
|
All times are GMT. The time now is 21:50. |
|
|