Armenian Knowledge Base  

Go Back   Armenian Knowledge Base > Technical sections > Languages, Compilers, Interpreters > Algorithms
Register

Reply
 
LinkBack Thread Tools
Old 22.11.2003, 05:16   #1
Banned
 
DaNYer's Avatar
 
Join Date: 10 2002
Location: Brooklyn, New York
Age: 39
Posts: 3,760
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default 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;
		}
	}
}
Reply With Quote
Old 22.11.2003, 05:19   #2
Banned
 
DaNYer's Avatar
 
Join Date: 10 2002
Location: Brooklyn, New York
Age: 39
Posts: 3,760
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

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.
Reply With Quote
Old 22.11.2003, 10:44   #3
Младенец
 
Фича's Avatar
 
Join Date: 11 2003
Location: клитляндия
Posts: 39
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default 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;
}
Reply With Quote
Old 22.11.2003, 10:51   #4
Младенец
 
Фича's Avatar
 
Join Date: 11 2003
Location: клитляндия
Posts: 39
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

умножение не стоит даже разбора так как почему - то у тебя регистры A Б и Кью одного размера, тогда как Кью должен был быть в два раза больше, значит программка не работает....
Reply With Quote
Old 22.11.2003, 16:55   #5
Banned
 
DaNYer's Avatar
 
Join Date: 10 2002
Location: Brooklyn, New York
Age: 39
Posts: 3,760
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

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.
Reply With Quote
Old 23.11.2003, 02:40   #6
Banned
 
DaNYer's Avatar
 
Join Date: 10 2002
Location: Brooklyn, New York
Age: 39
Posts: 3,760
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

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
Reply With Quote
Old 23.11.2003, 11:05   #7
Младенец
 
Фича's Avatar
 
Join Date: 11 2003
Location: клитляндия
Posts: 39
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

anyway, такой код, как в сумматоре не делает вам чести
Reply With Quote
Old 23.11.2003, 13:13   #8
Banned
 
DaNYer's Avatar
 
Join Date: 10 2002
Location: Brooklyn, New York
Age: 39
Posts: 3,760
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Quote:
Originally posted by Фича
anyway, такой код, как в сумматоре не делает вам чести
a mne . glavnoe chto rabotaet. a pobeditelei ne sudyat
Reply With Quote
Old 23.11.2003, 13:46   #9
Младенец
 
Фича's Avatar
 
Join Date: 11 2003
Location: клитляндия
Posts: 39
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

ну ну... вперед и с флагом в руках!
Reply With Quote
Old 23.11.2003, 13:50   #10
Banned
 
DaNYer's Avatar
 
Join Date: 10 2002
Location: Brooklyn, New York
Age: 39
Posts: 3,760
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

nu da

Multiplication ya sdelal, Booth's Mult. Alg. toje sdelal... teper' delo za division i mojno sdavat' project v expluataciyu.
Reply With Quote
Old 24.11.2003, 05:32   #11
Младенец
 
Фича's Avatar
 
Join Date: 11 2003
Location: клитляндия
Posts: 39
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Для суммирования предложил иную реализацию в вашей реализации алгоритма Бута...
А для лучшего написания программ, посоветовал бы вам собрать соответствующие схемы и смоделировать их...
Reply With Quote
Old 24.11.2003, 05:44   #12
Banned
 
DaNYer's Avatar
 
Join Date: 10 2002
Location: Brooklyn, New York
Age: 39
Posts: 3,760
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Quote:
Originally posted by Фича
Для суммирования предложил иную реализацию в вашей реализации алгоритма Бута...
А для лучшего написания программ, посоветовал бы вам собрать соответствующие схемы и смоделировать их...
radi boga davai na "ti" a?

bol'shoe spasibo za pomosh, eto mne ponadobitsya v dal'neishem
Reply With Quote
Old 27.11.2003, 07:51   #13
скромный VIP
 
analyst's Avatar
 
Join Date: 06 2003
Location: Yerevan
Age: 30
Posts: 960
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

d
Reply With Quote
Old 27.11.2003, 07:53   #14
скромный VIP
 
analyst's Avatar
 
Join Date: 06 2003
Location: Yerevan
Age: 30
Posts: 960
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default 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)
Reply With Quote
Sponsored Links
Reply

Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 04:27.


Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.