AKB Forums

Go Back   AKB Forums > Technical sections > Algorithms
Home Register Blogs FAQ Members List Calendar Downloads Arcade Mark Forums Read

Algorithms The source of algorithms for your project

Troubles when posting message? Click here! :: Проблемы с отправлением сообщения? Нажмите сюда!

Reply
 
LinkBack Thread Tools Display Modes
Old Nov 22, 2003, 05:16   #1
Banned
 
DaNYer's Avatar
 
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;
		}
	}
}
DaNYer is offline   Reply With Quote Quote selected
Old Nov 22, 2003, 05:19   #2
Banned
 
DaNYer's Avatar
 
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.
DaNYer is offline   Reply With Quote Quote selected
Old Nov 22, 2003, 10:44   #3
Младенец
 
Фича's Avatar
 
Join Date: Nov 2003
Location: клитляндия
Posts: 39
Rep Power: 0
Reputation: 10
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
Фича is offline   Reply With Quote Quote selected
Old Nov 22, 2003, 10:51   #4
Младенец
 
Фича's Avatar
 
Join Date: Nov 2003
Location: клитляндия
Posts: 39
Rep Power: 0
Reputation: 10
умножение не стоит даже разбора так как почему - то у тебя регистры A Б и Кью одного размера, тогда как Кью должен был быть в два раза больше, значит программка не работает....
__________________
pictores veneficiosque futuo
Фича is offline   Reply With Quote Quote selected
Old Nov 22, 2003, 16:55   #5
Banned
 
DaNYer's Avatar
 
Join Date: Oct 2002
Location: Brooklyn, New York
Posts: 3,760
Rep Power: 0
Reputation: 10
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.
DaNYer is offline   Reply With Quote Quote selected
Old Nov 23, 2003, 02:40   #6
Banned
 
DaNYer's Avatar
 
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
DaNYer is offline   Reply With Quote Quote selected
Old Nov 23, 2003, 11:05   #7
Младенец
 
Фича's Avatar
 
Join Date: Nov 2003
Location: клитляндия
Posts: 39
Rep Power: 0
Reputation: 10
anyway, такой код, как в сумматоре не делает вам чести
__________________
pictores veneficiosque futuo
Фича is offline   Reply With Quote Quote selected
Old Nov 23, 2003, 13:13   #8
Banned
 
DaNYer's Avatar
 
Join Date: Oct 2002
Location: Brooklyn, New York
Posts: 3,760
Rep Power: 0
Reputation: 10
Quote:
Originally posted by Фича
anyway, такой код, как в сумматоре не делает вам чести
a mne . glavnoe chto rabotaet. a pobeditelei ne sudyat
DaNYer is offline   Reply With Quote Quote selected
Old Nov 23, 2003, 13:46   #9
Младенец
 
Фича's Avatar
 
Join Date: Nov 2003
Location: клитляндия
Posts: 39
Rep Power: 0
Reputation: 10
ну ну... вперед и с флагом в руках!
__________________
pictores veneficiosque futuo
Фича is offline   Reply With Quote Quote selected
Old Nov 23, 2003, 13:50   #10
Banned
 
DaNYer's Avatar
 
Join Date: Oct 2002
Location: Brooklyn, New York
Posts: 3,760
Rep Power: 0
Reputation: 10
nu da

Multiplication ya sdelal, Booth's Mult. Alg. toje sdelal... teper' delo za division i mojno sdavat' project v expluataciyu.
DaNYer is offline   Reply With Quote Quote selected
Old Nov 24, 2003, 05:32   #11
Младенец
 
Фича's Avatar
 
Join Date: Nov 2003
Location: клитляндия
Posts: 39
Rep Power: 0
Reputation: 10
Для суммирования предложил иную реализацию в вашей реализации алгоритма Бута...
А для лучшего написания программ, посоветовал бы вам собрать соответствующие схемы и смоделировать их...
__________________
pictores veneficiosque futuo
Фича is offline   Reply With Quote Quote selected
Old Nov 24, 2003, 05:44   #12
Banned
 
DaNYer's Avatar
 
Join Date: Oct 2002
Location: Brooklyn, New York
Posts: 3,760
Rep Power: 0
Reputation: 10
Quote:
Originally posted by Фича
Для суммирования предложил иную реализацию в вашей реализации алгоритма Бута...
А для лучшего написания программ, посоветовал бы вам собрать соответствующие схемы и смоделировать их...
radi boga davai na "ti" a?

bol'shoe spasibo za pomosh, eto mne ponadobitsya v dal'neishem
DaNYer is offline   Reply With Quote Quote selected
Old Nov 27, 2003, 07:51   #13
скромный VIP
 
analyst's Avatar
 
Join Date: Jun 2003
Location: Yerevan
Posts: 960
Rep Power: 6
Reputation: 10
d
__________________
И аткуда такие беруцца???
analyst is offline   Reply With Quote Quote selected
Old Nov 27, 2003, 07:53   #14
скромный VIP
 
analyst's Avatar
 
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 вместо if
??
и еще, вместо того чтоб проверять значения элементов можно было б просуммировать эти самые элементы и ставить case на три случая суммы (их всего три - 0, 1, 2)
__________________
И аткуда такие беруцца???
analyst is offline   Reply With Quote Quote selected
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT. The time now is 17:20.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
This board was founded on September 29, 2001
Powered by Viper Internet

Affordable Web Hosting | ParevNet

Buy text link