Bitmap ausgeben < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 10:56 Sa 04.06.2011 | Autor: | steftn |
Aufgabe | #include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
for(i=0; i<16; i++)
{ if(4711 & (0x8000>>i))
printf("1");
else
printf("0");
}
return 0;
} |
Hallo,
also ich habe oben genanntes Programm vorgegeben.
Aber irgendwie verstehe ich nicht, was das Programm genau macht!
Mir ist z.b. völlig unklar, wie dieser Ablauf funktioniert:
{ if(4711 & (0x8000>>i))
printf("1");
else
printf("0");
}
Da wird doch zuerst 0x8000 um i nach rechts verschoben und dann mit 4711 UND-Verknüpft. Aber da steht doch ein if davor, also "WENN". Aber was soll das für einen Sinn ergeben??
"WENN 0x8000 um i nach rechts verschoben und dann mit 4711 UND-Verknüpft, dann 1 sonst 0" , hääää????
Nach WENN muss doch normalerweise irgend eine Bedingung kommen, z.b. WENN xzy=1 dann a=5 sonst b=7 ?? Aber hier ist das irgendwie nicht ersichtlich.
Ich versteh das nicht, das Programm funktioniert zwar, aber ich hab keine Ahnung wie.
Kann mir das vielleicht jemand erklären?
Ich hoffe ihr habt verstanden was ich nicht verstehe.
Wär super wenn mir das jemand erklären könnte.
gruß
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 12:03 Sa 04.06.2011 | Autor: | nsche |
hallo steftn
> if(4711 & (0x8000>>i))
> Da wird doch zuerst 0x8000 um i nach rechts verschoben und
> dann mit 4711 UND-Verknüpft. Aber da steht doch ein if
> davor, also "WENN". Aber was soll das für einen Sinn
> ergeben??
if prüft (intern) ob der Ausdruck in der Klammer richtig (true) ist oder falsch (false). Der Ausdruck gilt als false, wenn 0 herauskommt, anderenfalls gilt er als true.
> "WENN 0x8000 um i nach rechts verschoben und dann mit 4711
> UND-Verknüpft, dann 1 sonst 0" , hääää????
Passt schon: wenn das Ergebnis der UND-Verknüpfung 1 ergibt, wird eine 1 ausgegeben, anderenfalls eine 0.
> Nach WENN muss doch normalerweise irgend eine Bedingung
> kommen, z.b. WENN xzy=1 dann a=5 sonst b=7 ?? Aber hier ist
> das irgendwie nicht ersichtlich.
Anstelle von:
> if(4711 & (0x8000>>i))
hätte man auch
if(4711 & (0x8000>>i)==1)
schreiben können. Die Vergleichsoperation wird oft weggelassen. So steht:
if (i){...}
oft an Stelle von:
if (i!=0){...}
Eine ähnliche Geschichte:
for(i=10;i;i--{...}
an Stelle von:
for (i=10;i>0;i--{...}
viele Grüße
nsche
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 14:24 So 05.06.2011 | Autor: | steftn |
Hallo,
danke für deine Antwort, was ich aber nicht ganz verstehe:
als Lösung wird für die Bitmap dann
0001001100111 ausgegeben. Ich verstehe aber nicht wiso!
Weil zuerst wird doch 0x8000 um 0 nach rechts verschoben. Dann wird das mit 4711 UND-Verknüpft. Ergebnis: 0
(also praktisch so:
100011100010001
& 1000000000000000
-------------------
0000000000000000
dann ist hier doch das Ergebnis 0)
Als zweites wird dann 0x8000 um 1 nach rechts verschoben und dann mit 4711 UND-Verknüpft: Ergebnis 1
(sieht dann so aus:
100011100010001
& 0100000000000000
-------------------
0100000000000000
ist das Ergebnis dann 1, weil ja bei der &-Verknüpfung mindestens einmal 1 rauskommt?)
Als drittes wird dann 0x8000 um 2 nach rechts verschoben und dann mit 4711 UND-Verknüpft: Ergebnis: 0
(sieht dann so aus:
100011100010001
& 10000000000000
-----------------
000000000000000
hier kommt wieder 0 raus)
usw bis man 0x8000 halt dann schließlich um 15 nach rechts verschoben hat.
Dann würde bei mir aber sowas rauskommen:
0100011100010001
Was mache ich nur falsch?
Wär für jede Hilfe sehr dankbar!
gruß
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 14:55 So 05.06.2011 | Autor: | steftn |
Hallo,
ich hab den Fehler gefunden.
Ich Depp dachte die 4711 wär eine hexadezimalzahl...
Ist ja eine Dualzahl...
sorry
danke aber trotzdem!
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 15:29 So 05.06.2011 | Autor: | felixf |
Moin!
> danke für deine Antwort, was ich aber nicht ganz
> verstehe:
> als Lösung wird für die Bitmap dann
>
> 0001001100111 ausgegeben. Ich verstehe aber nicht wiso!
Also die Binaerdarstellung von 4711 ist 1001001100111.
> Weil zuerst wird doch 0x8000 um 0 nach rechts verschoben.
> Dann wird das mit 4711 UND-Verknüpft. Ergebnis: 0
>
> (also praktisch so:
>
> 100011100010001
> & 1000000000000000
> -------------------
> 0000000000000000
>
> dann ist hier doch das Ergebnis 0)
Genau.
> Als zweites wird dann 0x8000 um 1 nach rechts verschoben
> und dann mit 4711 UND-Verknüpft: Ergebnis 1
>
> (sieht dann so aus:
>
> 100011100010001
> & 0100000000000000
> -------------------
> 0100000000000000
>
> ist das Ergebnis dann 1, weil ja bei der &-Verknüpfung
> mindestens einmal 1 rauskommt?)
Nein, das Ergebnis ist schon 0100000000000000. Das ist jedoch ungleich 0, weswegen der then-Zweig der if-Abfrage ausgefuehrt wird.
> Als drittes wird dann 0x8000 um 2 nach rechts verschoben
> und dann mit 4711 UND-Verknüpft: Ergebnis: 0
> [...]
LG Felix
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:26 So 05.06.2011 | Autor: | felixf |
Moin!
> > "WENN 0x8000 um i nach rechts verschoben und dann mit 4711
> > UND-Verknüpft, dann 1 sonst 0" , hääää????
> Passt schon: wenn das Ergebnis der UND-Verknüpfung 1
> ergibt, wird eine 1 ausgegeben, anderenfalls eine 0.
Nicht ganz: wenn das Ergebnis der UND-Verknuepfung (hier steht ja die arithmetische/binaere und-Verknuepfung, nicht die logische) [mm] $\neq [/mm] 0$ ist, dann wird 1 ausgegeben, andernfalls 0.
> > Nach WENN muss doch normalerweise irgend eine Bedingung
> > kommen, z.b. WENN xzy=1 dann a=5 sonst b=7 ?? Aber hier ist
> > das irgendwie nicht ersichtlich.
> Anstelle von:
> > if(4711 & (0x8000>>i))
> hätte man auch
> if(4711 & (0x8000>>i)==1)
Das waer dann if(4711 & (0x8000>>i)!=0).
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 13:18 Mo 06.06.2011 | Autor: | steftn |
Aufgabe | Für die Ausgabe einer Bitmap steht das Unterprogramm PrintBitLine zu Verfügung:
void PrintBitLine(unsigned short us)
{ int i;
for(i=0; i<16; i++)
{ if(us & (0x8000>>i))
printf("1");
else
printf("0");
}
}
Erstellen Sie ein Programm und kopieren Sie PrintBitLine vor das main-Unterprogramm. Rufen Sie PrintBitLine zehn mal auf mit den Werten [mm] 1,2,....2^i, [/mm] ....2^10 . |
Hallo,
ich habe ein weiteres Problem. Wie kann ich einen Unterprogramm, also "void"-Programm aufrufen?
Mein selbsterstelltes Programm sieht bis jetzt so aus:
#include <stdio.h>
#include <stdlib.h>
void PrintBitLine(unsigned short us)
{ int i;
for(i=0; i<16; i++)
{ if(us & (0x8000>>i))
printf("1");
else
printf("0");
}
}
int main()
{
unsigned short us0 =1, us1 =2, us2 =4, us3 =8;
unsigned short us4 =16, us5 =32, us6 =64, us7 =128;
unsigned short us8 =256, us9 =512, us10=1024;
printf ("%d", PrintBitLine (unsigned short us0));
printf ("%d", PrintBitLine (unsigned short us1));
// usw. bis (unsigned short us10)
return 0;
}
Aber leider funktioniert das Programm so nicht.
Weiß jemand, wie ich das PrintBitLine als Unterprogramm mit den jeweiligen us0...us10-Werten aufrufen kann?
Wär super wenn ihr mir helfen könntet! Danke
|
|
|
|
|
Hallo steftn,
> Für die Ausgabe einer Bitmap steht das Unterprogramm
> PrintBitLine zu Verfügung:
>
> void PrintBitLine(unsigned short us)
> { int i;
> for(i=0; i<16; i++)
> { if(us & (0x8000>>i))
> printf("1");
> else
> printf("0");
> }
> }
>
>
> Erstellen Sie ein Programm und kopieren Sie PrintBitLine
> vor das main-Unterprogramm. Rufen Sie PrintBitLine zehn mal
> auf mit den Werten [mm]1,2,....2^i,[/mm] ....2^10 .
> Hallo,
>
> ich habe ein weiteres Problem. Wie kann ich einen
> Unterprogramm, also "void"-Programm aufrufen?
>
> Mein selbsterstelltes Programm sieht bis jetzt so aus:
>
>
> #include <stdio.h>
> #include <stdlib.h>
>
>
>
> void PrintBitLine(unsigned short us)
> { int i;
> for(i=0; i<16; i++)
> { if(us & (0x8000>>i))
> printf("1");
> else
> printf("0");
> }
> }
> int main()
> {
>
> unsigned short us0 =1, us1 =2, us2 =4, us3 =8;
> unsigned short us4 =16, us5 =32, us6 =64, us7 =128;
> unsigned short us8 =256, us9 =512, us10=1024;
>
> printf ("%d", PrintBitLine (unsigned short us0));
> printf ("%d", PrintBitLine (unsigned short us1));
Das UnterProgramm PrintBitLine hat den Rückgabetyp void,
gibt demnach nichts zurück. Die Ausgabe dieses Unterprogramms
geschieht in dem selbigen, so daß hier folgender Aufruf in der
main-Funktion erfolgen muss:
PrintBitLine(us0);
>
> // usw. bis (unsigned short us10)
> return 0;
> }
>
>
> Aber leider funktioniert das Programm so nicht.
> Weiß jemand, wie ich das PrintBitLine als Unterprogramm
> mit den jeweiligen us0...us10-Werten aufrufen kann?
>
> Wär super wenn ihr mir helfen könntet! Danke
Gruss
MathePower
|
|
|
|