myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

[C] Hilfe bei Bitshifting Operatoren

Willkommen

myGully

Links

Forum

 
Antwort
 
Themen-Optionen Ansicht
Ungelesen 19.10.09, 09:52   #1
Rioter
Anfänger
 
Registriert seit: May 2009
Beiträge: 3
Bedankt: 0
Rioter ist noch neu hier! | 0 Respekt Punkte
Standard [C] Hilfe bei Bitshifting Operatoren

Hallo,

mein Problem ist folgendens. Ich bin totaler Programmier Anfänger und brauche Hilfe.
Die Aufgabenstellung sieht so aus das ich ein Programm schreiben soll das die Binärpräsentation eines Integers ausgeben soll. Die einzelnen Bytes sollen mit "|" getrennt werden und der Integer soll vorher eingelesen werden.

Bitte um rasche Lösungsvorschläge

Schon mal danke im voraus
Rioter ist offline   Mit Zitat antworten
Ungelesen 19.10.09, 12:03   #2
urga
Mitglied
 
Benutzerbild von urga
 
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
urga ist noch neu hier! | 0 Respekt Punkte
Standard

also das hier funktioniert, allerdings wird nicht abgefangen ob auch wirklich ein int eingelesen wurde. versuch aber bitte zu verstehen was da passiert.
Code:
// ein int belegt sizeof(int) bytes.
	// damit sizeof(int)*8 bits. [bN, .... b1, b0]
	// wenn ich nun eine 1 auf position bN bringen möchte, muss ich
	int shift = ((sizeof (int)) * 8) - 1;
	// shift mal die 1 nach links schieben.
	unsigned int pattern = 1 << shift;
	// pattern ist nun [1, 0, 0 , .... , 0]
	int the_int;
	// the_int ist der int der binär ausgegeben werden soll.

	printf ("bitte einen int eingeben ");
	scanf ("%d", &the_int);
	
	// nun muss N (also shift+1) mal geprüft werden ob bei the_int das N'te bit gesetzt ist.
	int i;
	for (i = 0; i <= shift; i++) {
		if (the_int & pattern) { 
			printf ("1");
		}
		else {
			printf ("0");
		}
		// nun noch die 1 im pattern um eine position nach rechts.
		// (*) aus der doku:
		// The right shift operator causes the bit pattern in the first operand to be shifted right the number 
		// of bits specified by the second operand. 
		// Bits vacated by the shift operation are zero-filled for unsigned quantities. 
		// For signed quantities, the sign bit is propagated into the vacated bit positions
		// 
		// wir wollen das nullen nachgeschoben werden. desshalb ist pattern unsigned...
		pattern = pattern >> 1;
		if (i < shift) {
			printf ("|");
		}
	}
	printf ("\n");
__________________
entropie erfordert keine wartung
urga ist offline   Mit Zitat antworten
Ungelesen 21.10.09, 01:10   #3
Rioter
Anfänger
 
Registriert seit: May 2009
Beiträge: 3
Bedankt: 0
Rioter ist noch neu hier! | 0 Respekt Punkte
Standard Thx

Danke für die rasche Antwort, aber viel schlauer bin ich noch nicht geworden.
Hab mal das von dir gepostete kompiliert hat aber nur fehlermeldungen rausgespuckt.
So ganz hab ich auch noch nicht verstanden was bei dir the_int & pattern macht.
Wo werden die Bits dahin geschoben dass sie das integer als Binärezahl darstellen?

Danke für ne rasche anwort
Rioter ist offline   Mit Zitat antworten
Ungelesen 21.10.09, 01:33   #4
urga
Mitglied
 
Benutzerbild von urga
 
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
urga ist noch neu hier! | 0 Respekt Punkte
Standard

1) das was ich gepostet habe ist kein komplettes c-programm
da gehört noch mind:
Code:
#include <stdio.h>
#include <stdlib.h>
int main() 
{
.....
}
drumherum
2) probier das mal, und poste dann die fehler.
3) unter welchen os programmierst du? und mit welchem compiler ? z.b. gcc unter linux ...

4) the_int & pattern: am beispiel anhand von 4 bits:

sei the_int = 5 = [0,1,0,1]
und pattern zum anfang [1,0,0,0]
[0,1,0,1] & [1,0,0,0] = 0

dann jeweils pattern = pattern >> 1;
[0,1,0,1] & [0,1,0,0] = 1
[0,1,0,1] & [0,0,1,0] = 0
[0,1,0,1] & [0,0,0,1] = 1

das if (the_int & pattern) wird wahr wenn im ergebnis von the_int & pattern auch nur ein bit auf 1 steht.

also wenn a = b & c;
und a,b,c sind vom typ int.
dann ergibt sich das ergebnis c aus der bitweisen UND-vernüpfung von b und c.
also [aN, .. a1, a0] = [bN AND cN, ...., b1 AND c1, b0 AND c0]
__________________
entropie erfordert keine wartung
urga ist offline   Mit Zitat antworten
Ungelesen 22.10.09, 11:23   #5
Rioter
Anfänger
 
Registriert seit: May 2009
Beiträge: 3
Bedankt: 0
Rioter ist noch neu hier! | 0 Respekt Punkte
Standard bytes trennen durch |

Hab ne andere Variante um von Dezimal auf binär umzurechnen. Mein Problem is aber, dass ich nicht weiss wie ich alle bytes mit | voneinander trennen soll. Habs mit ner for schleife probiert klappt aber milde gesagt nicht so ganz. Ich hoffe du kannst mir helfen...

#include <stdio.h>

int main()
{
unsigned int value,i;
unsigned int bin[32];
printf("Please enter an integer:");
scanf("%d",&value);
int j;
for(i=0;i<32;i++)
{
bin[i]=((value>>i)&1);

}

for(i=0;i<32;i++)
{
for (j=8;j<32;j++)
{
if ( j <= (j+)
{
printf ("|");
}
}
printf("%d",bin[31-i]);
}

printf("\n");
return 0;
}
Rioter ist offline   Mit Zitat antworten
Ungelesen 22.10.09, 13:17   #6
urga
Mitglied
 
Benutzerbild von urga
 
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
urga ist noch neu hier! | 0 Respekt Punkte
Standard

ach die bytes sollen getrennt werden.
ok.
Code:
for (i = 0; i < 32; i++) {
 printf("%d",bin[31-i]); 
 if (i+1 % 8 == 0) printf (" | ");
}
müsste klappen (ungetestet)
__________________
entropie erfordert keine wartung
urga ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:47 Uhr.


Sitemap

().