bitshifting

0664jester

Mitglied
hallo,

ich schreibe an einem programm wo man nur +, - oder shift verwenden darf, da ich es dann auf Transistoren, etc ummünze. das c programm nutze ich nur als vorlage für die eigentliche aufgabe, das programm in logisim erstellen.
Das Thema ist die Modulo Rechnung: a*b mod c, z. b: 4*4 mod 2 = 0

Hier zuerst wie weit ich bin. Dabei habe ich ein paar unwichtige Codefragment ausgelassen.

Code:
#include <stdio.h>


int printBinary(int quotient);
void PrintBinary(int num);

int main()
{
  int konst = 00000001;
	unsigned int a = 6;
	unsigned int b = 4;
  unsigned int mod = 2;
  unsigned int i = 0;
 	unsigned int sum = 0;
	unsigned int zahl1 = 0;
	unsigned int zahl2;
	unsigned int shift = 7;

  if( mod == 0)
  {
  	printf("Modular must be bigger than 0!\n");
  }
  else
  {
  	//addieren
	  while(i < b) 
	  {
			sum = sum + a;
			i++;
	  }
		//Bitshifting
		//e.g. 8bit 0000 0001
		sum = 15;
		while( zahl1 != konst )
		{
			zahl2 = sum << shift;
			PrintBinary(zahl2); 
			zahl2 = zahl2 >> 7;
			PrintBinary(zahl2); 
			zahl1 = zahl2 | konst;
			PrintBinary(zahl1); 
			shift--;
			printf("shift--: %d\n", shift);
		}
		
		// int j = shift++;
		int j = (shift + 1);
		printf("j = %d\n", j);
		

		// Modulo
		shift = mod << j;
		printf("shift: %d\n", shift);
	
		sum = sum - shift;
		printf("sum: %d", sum);

		while(sum >= mod)
		{
			sum = sum - mod; 
		}
		printf("sum = %d\n", sum);
	}
return 0;
}


//---------------------------------------------------------------------------
// Method
void PrintBinary(int num) 
{
	int index = 0;
	printf("Dec:%d As binary: ",num);
	for(index = 7; index >= 0; index--)
	{	
		if( (1 << index) & num)
		{
			printf("1");
		} 
		else  
		{
			printf("0");
		}
		
		if(index!=7 && index%4==0) 
		{
			printf(" ");
		}
	}
	printf("\n");
}




Ich versuche diese Variante:
Man schiebt zu Beginn den Modul msolange nach links, bis das zweite Bit von links (im 16?Bit?Register) den Wert 1 kriegt. Der Automat merkt sich dabei die Anzahl der Schiebeoperationen (= j) für später.
Wenn dann nach der Multiplikation die Modulo?Berechnung beginnt, kann man mit dem vorher
„geeignet“ nach links verschobenen Wert beginnen. Man subtrahiert also m*2^j
und sieht nach, obdas Ergebnis negativ wurde.
Wenn ja, dann ignoriert man dieses Ergebnis, schiebt m um eine Stelle
nach rechts und versucht es mit m*2^j?1. Sobald das Ergebnis der Subtraktion positiv ist, merkt man
sich dieses Zwischenergebnis als neuen Wert. Dies macht man solange, bis man endlich das Ergebnis
hat.

Bei der Modulorechnung (ab zeile 47) hängt es. Ich habs mir so gedacht.
c^anzahl shifts, die ich dann der summe abzähle, damit ich auf den rest komme.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück