k.A. was der Programmteil macht
-
Hi, hab ein tolles Programm gemacht versteh aber nicht wie es funktioniert.
Es soll d_e_z_i_m_a_l in b_i_n umwandelnint dec_input,counter;
while(scanf ("%d", &dec_input)){for (counter = 31; counter > -1; counter--)
{if ((dec_input / (1<<(counter))) >= 1) // <-------- diese Zeile!!
{
printf("1");
dec_input = dec_input - (1<<(counter));
}
else
printf("0");
if (!(counter%8)) printf(" ");printf("\n");
Wär echt nett wenn das so in der Art Struktogramm bzw. der genaue Ablauf, aber nur von dieser Zeile wenns fürs Verständnis reicht gezeigt wird.
Danke
mfg
________________
und wieder ein Tag rum
-
mhm... eigentlich verständnismäßig vieles klar bez. Strukturierter und Objektorientierter Programmierung nur mit den Shifts und Operatoren in C kenn ich mich noch nicht so gut aus. Hab in TPascal schwimmen gelernt.
Und bez. des Programmes. Hab ich geschafft dass alles funktioniert was ich benötige, nur versteh ich nicht wieso links geshiftet wird und wo der sonst anfängt zu schreiben. Gebe nämlich das ganze als 32 bit zahl aus mit " " nach 8 Stellen.
lg
-
schreib dir halt mal auf ein blatt auf, wie die zahlen aussehen, wenn man shiftet. wenn du er durchrechnest solltest du es verstehen.
-
Ein Links-Shift "x<<n" ist eine 'optimierte' Version der Multiplikation "x*2n" - ein in C durchaus üblicher Programmier"trick", um sich die (idR aufwendigere) Potenzierung ersparen zu können.
PS sfds
-
for (counter = 31; counter > -1; counter--) { if ((dec_input / (1<<(counter))) >= 1) // <-------- diese Zeile!! { printf("1"); dec_input = dec_input - (1<<(counter)); } else printf("0"); }
Meinem Verständnis nach dividiert er die Dezimalzahl, die ich eingebe durch
1*2^counter wobei counter im ersten Durchlauf 32 ist. und Vergleicht dann ob
gößer kleiner 1. Mir ist das Kriterium einfach unklar, wann er 0 und wann er 1 schreibt
-
Dann schau dir das am besten mit einigen Beispieldaten an.
(Wenn x größer als 2counter ist, ist mindestens ein Bit oberhalb der Position 'counter' gesetzt. Durch die Subtraktion in der Schleife wurd schon sichergestellt, daß alle höherwertigen Bits gelöscht wurden - damit ist die Bedingung genau dann erfüllt, wenn das 'counter'te Bit gesetzt ist)
PS: Ich würde die Bedingung übrigens anders formulieren:
for (counter = 31; counter > -1; counter--) { if ((dec_input & (1<<(counter)))// ist Bit 'counter' gesetzt? { printf("1"); } else printf("0"); } //oder kürzer: for (counter = 31; counter > -1; counter--) { printf( ((dec_input & (1<<(counter))) ? "1":"0" ) } //und wenn man die Zweierpotenz direkt als Zähler verwendet: for(counter = 1<<31;counter>0; counter>>=1) printf( (dec_input&counter)?"1":"0" );
-
nomoi schrieb:
Hi, hab ein tolles Programm gemacht versteh aber nicht wie es funktioniert.
Es soll d_e_z_i_m_a_l in b_i_n umwandelndas programm ist nicht toll. such mal hier im forum. da findest du 1001 nette alternativen.