Forum: C-Programmieren
Moderatoren: juergen, Martin ConradThema: Binärdarstellung mit besonderer Vorgehensweise
Binärdarstellung mit besonderer Vorgehensweise
cryl0v am 06.12.2011 um 20:05
Ich habe in C bereits Erfahrung und das Buch von Herr Wolf gelesen, aber der Algorithmus bereitet mir Schwierigkeiten.
Ich glaube aber, dass es wahrscheinlich mit den Shiftoperanden lösbar sein könnte.
Das ist eine Teilaufgabe von den Hausaufgaben an der Uni.
Es wäre nett, wenn jemand eine Strategie nennt, wie man vorgehen könnte.
cheers cryl0v
Re: Binärdarstellung mit besonderer Vorgehensweise
icefire am 06.12.2011 um 20:14
Zitat:
..., aber der Algorithmus bereitet mir Schwierigkeiten.
Weißt du allgemein wie man Dezimalzahlen in Binärzahlen umrechnet (also mit Zettel und Stift)?
Falls ja: Wie würdest du in C testen, ob zB das unterste Bit einer Zahl gesetzt ist? Wie das zweite Bit? Und das dritte? Daraus kann man schön eine Schleife bauen
Ich wollte nicht gleich die Lösung verraten, würde dir ja den Spaß an der Aufgabe nehmen, aber falls der Tipp nicht ausreichend war, einfach wieder nachfragen.
mfg, Wolfgang
--
Hex, Bugs and Rock 'n Roll
[EDIT] - Re: Binärdarstellung mit besonderer Vorgehensweise
cryl0v am 06.12.2011 um 20:32
2022 : 2 = 1011 R 0
1011 : 2 = 505 R 1
505 : 2 = 252 R 1
252 : 2 = 126 R 0
126 : 2 = 63 R 0
63 : 2 = 31 R 1
31 : 2 = 15 R 1
15 : 2 = 7 R 1
7 : 2 = 3 R 1
3 : 2 = 1 R 1
1 : 2 = 0 R 1
Nur als Beweis, dass mir etwas an dem Lösungschritt liegt :D
Nun zu deiner Frage:
Vielleicht weiß ich es, aber es fällt mir nicht ein. Schleife ist auch schonmal klar.
Das unterste Bit könnte ich wie oben in der Umwandlung gezeigt durch ein Modulo und dem daraus
resultierenden Rest bestimmen.
Ich weiß nicht, ob es das ist was dir im Sinn liegt. Ich muss aufjedenfall "Operatoren zur Bitmanipulation" verwenden. Da liegt das Problem^^
[EDIT] - Re: Binärdarstellung mit besonderer Vorgehensweise
icefire am 06.12.2011 um 20:46
Zitat:
Ich muss aufjedenfall "Operatoren zur Bitmanipulation" verwenden. Da liegt das Problem^^
Link-Tip: Wiki: Logische Verknüpfung
Angenommen wir haben eine Zahl x, und wollen testen, ob das unterste Bit gesetzt ist, dann könnten wir die Zahl mit einer zweiten Zahl logisch UND-verknüpfen, wobei wir als zweite Zahl eine Zahl wählen, bei der nur das unterste Bit gesetzt ist (also die Zahl 1).
Wenn das unterste Bit nicht gesetzt ist, kommt numerisch 0 raus, sonst nicht.
int x;
int y;
int t; // t für "temporäre Variable"
x = 12345;
y = 1;
t = x & y;
if( t == 0 )
{
printf( "Das unterste Bit war NICHT gesetzt" );
}
else
{
printf( "Das unterste Bit war gesetzt" );
}
Wenn wir jetzt statt dem untersten Bit das nächste Bit test wollten, dann könnten wir die Variable y mit einem geeigneten Bit-Operator entsprechend verändern (Wir wollen das Bit weiterschieben).
mfg, Wolfgang
--
Hex, Bugs and Rock 'n Roll
[EDIT] - Re: Binärdarstellung mit besonderer Vorgehensweise
cryl0v am 06.12.2011 um 21:18
Das meinst du also. Die Idee habe ich übrigens auch gehabt, aber ich dachte ich muss die Zahl erst umwandeln und hatte vergessen, dass ich es direkt angeben kann.
Ich habe mich mal an den Code gemacht, aber irgendwo einen Denkfehler.
Als Wert gebe ich 8 ein und es mus das rauskommen, aber er schiebt nicht den letzen Bit
00000000 00000000 00000000 00001000
der Wert 0x7FFFFFFF EDIT: 0x80000000 ist das höchste Bit soll das Limit von int darstellen, also 2^31. Ich bin mir aber nicht sicher, ob ich richtig eingetippt habe im Windows Calculator^^
zumindestens wollte ich
10000000 00000000 00000000 00000000
rauskriegen
EDIT: 21:36
Ich habe vergessen, dass das letzte Bit das Vorzeichen darstellt. wenn ich
01000000 00000000 00000000 00000000
umwandle, dann ist y = 0x40000000
Dann kommt das erwartete Ergebnis raus.
Jetzt noch die Frage, wie geht man an die negativen ganzen Zahlen ran *grübel*
#include <stdio.h>
#include <stdlib.h>
void wertleser(int *wert);
int main(void) {
int i, x, y, counter;
y=0x7FFFFFFF;
counter=1;
printf("Bitte ganze Zahl eingeben: ");
wertleser(&x);
for(i=0; i < 31; i++) {
if (counter % 8 == 0)
printf(" ");
if(x & y)
printf("1");
else
printf("0");
counter++;
y = y >> 1;
}
getchar();
return 0;
}
void wertleser(int *wert) {
int zahl;
if(scanf("%d",&zahl)!=1) {
do {
printf("\nERROR: Bitte nur Zahlen eingeben: ");
fflush(stdin);
}
while (scanf("%d",&zahl)!=1);
*wert=zahl;
}
else {
*wert=zahl;
}
}
