<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.freitagsrunde.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Morn</id>
	<title>FreitagsrundenWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.freitagsrunde.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Morn"/>
	<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/Spezial:Beitr%C3%A4ge/Morn"/>
	<updated>2026-05-08T16:50:49Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.31.16</generator>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs/digitalesSchloesserKnacken/Musterl%C3%B6sung&amp;diff=21328</id>
		<title>C-Kurs/digitalesSchloesserKnacken/Musterlösung</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs/digitalesSchloesserKnacken/Musterl%C3%B6sung&amp;diff=21328"/>
		<updated>2013-09-10T13:45:13Z</updated>

		<summary type="html">&lt;p&gt;Morn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
unsigned int* abb;&lt;br /&gt;
unsigned int versuche = 0;&lt;br /&gt;
&lt;br /&gt;
void generate(void);&lt;br /&gt;
int test(unsigned int);&lt;br /&gt;
char * toBin(unsigned int);&lt;br /&gt;
unsigned int switchBit(int key, int whichBit);&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
	generate();&lt;br /&gt;
	unsigned int key = 0;&lt;br /&gt;
	/* Ab hier kannst du versuchen die Tür mit deinem Schlüssel zu knacken.&lt;br /&gt;
	 Verändere die Variable &amp;quot;Key&amp;quot; mit den dir bekannten bitweisen Operatoren,&lt;br /&gt;
	 die du in der Vorlesung kennengelernt hast.&lt;br /&gt;
	 Du kannst deinen Schlüssel dann mit der Funktion test() überprüfen, &lt;br /&gt;
	 welcher als Parameter übergeben wird.&lt;br /&gt;
	 Bitte beachte, dass sowohl Schlüssel als auch Schloss unsigned Integer sind.&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	int i = 0;&lt;br /&gt;
	for(; i &amp;lt; 32 ; i++){/* für jedes Bit wird geprüft ob es richtig ist oder ob es getaucht werden muss*/&lt;br /&gt;
		int rightBits  = test(key);/* Anzahl der richtigen Bits bevor das i-te Bit getauscht wurde*/&lt;br /&gt;
		int newRightBits = test(switchBit(key,i));/* Anzahl der richtigen Bits nachdem das i-te Bit getauscht wurde*/&lt;br /&gt;
		if(newRightBits &amp;gt; rightBits)&lt;br /&gt;
		/* Wenn die Anzahl der richtigen Bits nach dem Tausch größer ist als vorher,&lt;br /&gt;
		 ist der Schluessel mit dem getauschten Bit der neue Schlüssel*/&lt;br /&gt;
			key=switchBit(key,i);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*Diese Funktion vertauscht das in whichBit übergebene Bit in dem übergebenen Schlüssel&lt;br /&gt;
 und liefert den so veränderten Schlüssel als Rückgabewert*/&lt;br /&gt;
unsigned int switchBit(int key , int whichBit)&lt;br /&gt;
{&lt;br /&gt;
	return key ^ (1&amp;lt;&amp;lt;whichBit);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Diese Funktion liefert die Anzahl der richtigen Bits des übergebenen Schlüssels zurück.&lt;br /&gt;
 Falls 32 zurückgeliefert wird, war der Schlüssel richtig und die Tür öffnet sich.&lt;br /&gt;
 */&lt;br /&gt;
int test(unsigned int toTest)&lt;br /&gt;
{&lt;br /&gt;
	int rightBits = 0;&lt;br /&gt;
	int i = 0;&lt;br /&gt;
	for(; i&amp;lt; 32 ; i++){&lt;br /&gt;
		unsigned int x = 1 &amp;lt;&amp;lt; i;&lt;br /&gt;
		if(! ~((toTest &amp;amp; x) ^ (*abb| ~x))){&lt;br /&gt;
			rightBits++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if(rightBits == 32){&lt;br /&gt;
		printf (&amp;quot;\nGratulation !\n\n&amp;quot;);&lt;br /&gt;
		printf (&amp;quot;Die Tuer ist offen.\n&amp;quot;);&lt;br /&gt;
		printf (&amp;quot;So sahen Schluessel und Schloss aus \n&amp;quot;);&lt;br /&gt;
		printf (&amp;quot;Schloss    : %32s \n&amp;quot;, toBin(*abb));&lt;br /&gt;
		printf (&amp;quot;Schluessel : %32s \n&amp;quot;, toBin(~*abb));&lt;br /&gt;
		exit(0);&lt;br /&gt;
	}else{&lt;br /&gt;
		printf (&amp;quot;%d . Versuch, %d richtige Bits \n&amp;quot;, ++versuche, rightBits);&lt;br /&gt;
		return rightBits;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*Hier wird das zufällige Schloss generiert. Bitte nicht verändern sonst geht der Spaß verloren. */&lt;br /&gt;
void generate(void)&lt;br /&gt;
{&lt;br /&gt;
	printf (&amp;quot;\nSchloss wurde erstellt.\nViel Spass beim probieren.\n\n&amp;quot;);&lt;br /&gt;
	unsigned int secret;&lt;br /&gt;
	abb = (unsigned int*) malloc (sizeof(unsigned int));&lt;br /&gt;
	srand ( time(NULL) );&lt;br /&gt;
	secret = rand();&lt;br /&gt;
	*abb = secret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*Konvertierungsfunktion zur Ausgabe der Binärrepräsentation einer Zahl*/&lt;br /&gt;
char * toBin(unsigned int num)&lt;br /&gt;
{&lt;br /&gt;
	static char retbuf[33];&lt;br /&gt;
	int i =0;&lt;br /&gt;
	for(; i&amp;lt;33 ; i++){&lt;br /&gt;
		retbuf[i]='0';&lt;br /&gt;
	}&lt;br /&gt;
	char *p;&lt;br /&gt;
	p = &amp;amp;retbuf[sizeof(retbuf)-1];&lt;br /&gt;
	*p = '\0';&lt;br /&gt;
	do {&lt;br /&gt;
		*--p = &amp;quot;0123456789abcdef&amp;quot;[num % 2];&lt;br /&gt;
		num /= 2;&lt;br /&gt;
	} while(num != 0);&lt;br /&gt;
	return retbuf;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Morn</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs/digitalesSchloesserKnacken&amp;diff=21327</id>
		<title>C-Kurs/digitalesSchloesserKnacken</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs/digitalesSchloesserKnacken&amp;diff=21327"/>
		<updated>2013-09-10T13:44:43Z</updated>

		<summary type="html">&lt;p&gt;Morn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Aufgabe==&lt;br /&gt;
In dieser Aufgabe geht es darum für ein digitales Schloss den passenden Schlüssel zu finden. Dabei werden sowohl Schloss als auch Schlüssel  durch eine Integer-Variable repräsentiert (genauer gesagt die Binärrepräsentation). Damit ein Schlüssel zu einem Schloss passt, muss der Schlüssel an Stellen, an denen 0-en im Schloss zu finden sind, eine 1 aufweisen. Das Gleiche gilt im Gegenzug für die 1-en. Also muss der Schlüssel das bitweise Komplement des Schlosses sein. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Schlüssel: 010001110 &lt;br /&gt;
 Schloss:   101110001&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Schwierigkeit besteht nun darin, dass der Aufbau des Schlosses nicht bekannt ist. Es muss also probiert werden. Dieses kann mit der Funktion test() geschehen. Sie nimmt einen Schlüssel, testet ihn am Schloss und liefert die Anzahl der richtigen Bits als Rückgabewert. Falls der richtige Schlüssel gefunden ist, beendet die Funktion test() automatisch das Programm und gibt eine entsprechende Meldung aus.&lt;br /&gt;
&lt;br /&gt;
''Für Perfektionisten: Man braucht maximal &amp;lt;Bits im Schlüssel&amp;gt; Versuche. - (°X|''&lt;br /&gt;
&lt;br /&gt;
==Vorgabe==&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;time.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 unsigned int* abb;&lt;br /&gt;
 unsigned int versuche = 0;&lt;br /&gt;
 &lt;br /&gt;
 void generate(void);&lt;br /&gt;
 int test(unsigned int);&lt;br /&gt;
 char * toBin(unsigned int);&lt;br /&gt;
 &lt;br /&gt;
 int main (void)&lt;br /&gt;
 {&lt;br /&gt;
  generate();&lt;br /&gt;
  unsigned int key = 0;&lt;br /&gt;
  /* Ab hier kannst du versuchen die Tür mit deinem Schlüssel zu knacken.&lt;br /&gt;
  Verändere die Variable &amp;quot;Key&amp;quot; mit den dir bekannten bitweisen Operatoren,&lt;br /&gt;
  die du in der Vorlesung kennengelernt hast.&lt;br /&gt;
  Du kannst deinen Schlüssel dann mit der Funktion test() überprüfen, &lt;br /&gt;
  welcher als Parameter übergeben wird.&lt;br /&gt;
  Bitte beachte, dass sowohl Schlüssel als auch Schloss unsigned Integer sind.&lt;br /&gt;
  */&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 /* Diese Funktion liefert die Anzahl der richtigen Bits des übergebenen Schlüssels zurück.&lt;br /&gt;
 Falls 32 zurückgeliefert wird, war der Schlüssel richtig und die Tür öffnet sich.&lt;br /&gt;
 */&lt;br /&gt;
 int test(unsigned int toTest)&lt;br /&gt;
 {&lt;br /&gt;
 int rightBits = 0;&lt;br /&gt;
 int i = 0;&lt;br /&gt;
 for(; i&amp;lt; 32 ; i++){&lt;br /&gt;
  unsigned int x = 1 &amp;lt;&amp;lt; i;&lt;br /&gt;
  if(! ~((toTest &amp;amp; x) ^ (*abb| ~x))){&lt;br /&gt;
   rightBits++;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 if(rightBits == 32){&lt;br /&gt;
  printf (&amp;quot;\nGratulation !\n\n&amp;quot;);&lt;br /&gt;
  printf (&amp;quot;Die Tuer ist offen.\n&amp;quot;);&lt;br /&gt;
  printf (&amp;quot;So sahen Schluessel und Schloss aus \n&amp;quot;);&lt;br /&gt;
  printf (&amp;quot;Schloss    : %32s \n&amp;quot;, toBin(*abb));&lt;br /&gt;
  printf (&amp;quot;Schluessel : %32s \n&amp;quot;, toBin(~*abb));&lt;br /&gt;
  exit(0);&lt;br /&gt;
 }else{&lt;br /&gt;
  printf (&amp;quot;%d . Versuch, %d richtige Bits \n&amp;quot;, ++versuche, rightBits);&lt;br /&gt;
  return rightBits;&lt;br /&gt;
 }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /*Hier wird das zufällige Schloss generiert. Bitte nicht veraendern sonst geht der Spaß verloren. */&lt;br /&gt;
 void generate(void)&lt;br /&gt;
 {&lt;br /&gt;
  printf (&amp;quot;\nSchloss wurde erstellt.\nViel Spass beim probieren.\n\n&amp;quot;);&lt;br /&gt;
  unsigned int secret;&lt;br /&gt;
  abb = (unsigned int*) malloc (sizeof(unsigned int));&lt;br /&gt;
  srand ( time(NULL) );&lt;br /&gt;
  secret = rand();&lt;br /&gt;
  *abb = secret;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /*Konvertierungsfunktion zur Ausgabe der Binaerrepraesentation einer Zahl*/&lt;br /&gt;
 char * toBin(unsigned int num)&lt;br /&gt;
 {&lt;br /&gt;
  static char retbuf[33];&lt;br /&gt;
  int i =0;&lt;br /&gt;
  for(; i&amp;lt;33 ; i++){&lt;br /&gt;
   retbuf[i]='0';&lt;br /&gt;
  }&lt;br /&gt;
  char *p;&lt;br /&gt;
  p = &amp;amp;retbuf[sizeof(retbuf)-1];&lt;br /&gt;
  *p = '\0';&lt;br /&gt;
  do {&lt;br /&gt;
   *--p = &amp;quot;0123456789abcdef&amp;quot;[num % 2];&lt;br /&gt;
   num /= 2;&lt;br /&gt;
  } while(num != 0);&lt;br /&gt;
  return retbuf;&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Morn</name></author>
		
	</entry>
</feed>