|
|
||
|
|
||
| .. Beispiel: Ganzzahl binär ausgeben | ||
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
// prtbin.cpp
// ------------ Version 06.10.2007
// Borland IDE C++ 3.1 oder 5.02
// Model: SMALL
// Char: unsigned
// bearbeitet: www.GoBlack.de, D.Schwarzer
// Hardware: jeder DOS-PC
#include <stdio> // für printf()
#include <conio> // für getch()
// prtbin()
// Zerlegt die in einem Byte (char) oder word (unsigned) übergebene
// Zahl 'byte' in eine Folge von Einsen und Nullen und gibt von
// dieser die unteren acht Bit zum Bildschirm aus.
void prtbin(unsigned byte)
{
for(char i=0; i<8; i++) printf("%u",(byte>>(7-i))& 0x0001);
}
// main()
// ruft die Funktion prtbin() mit einem Übergabewert, der binär
// dargestellt werden soll, auf und wartet dann auf einen
// Tastendruck.
void main (void)
{
char zahl = 0x9A;
printf("Darstellung des Speicherinhalts ..\r\n\n"
"hexadezimal %Xh = dezimal %u = binär ", zahl, zahl);
prtbin(zahl);
getch();
}
|
||
|
|
|
|
|
|
|
|
|
|
|
|
void prtbin(unsigned byte)
{
char i;
unsigned tmp=0;
for(i=0; i<8; i=i+1){
tmp= byte>>(7-i);
tmp= tmp&0x0001;
printf("%u", tmp);
}
}
|
||
|
|
|
|
|
|
|
|
|
|
Ersetzt man übrigens in obigem Programm die 8 durch 16 und die 7 durch 15, lassen sich auch alle 16 Bits des übergebenen Wortes byte, binär darstellen. |
|
|
|
|
|
|
Varianten
Möchte
man das Wandlungsergebnis des Binärwertes in einen
Binärstring nicht unmittelbar über printf() zum
Bildschirm ausgeben, so kann man den String zunächst in
einem Buffer ablegen und die Funktion einen Zeiger auf diesen
Buffer zurückgeben lassen.
Dieser
String kann dann im aufrufenden Programm beliebig weiterverwendet
werden.
Beispiel 1: |
||
// bintoa()
// wandelt die Ganzzahl des übergebenen Bytes 'byte' in einen
// nullterminierten String mit binärem ASCII-Code und gibt einen
// Zeiger auf diesen String zurück.
char* bintoa(char byte)
{
static char binbuf[8+1]; // Buffer auf dem Heap,
// nicht auf dem Stack
for(signed char n=7; n>=0; n--){
binbuf[n] = (byte & 0x01); // unterstes Bit isoliert
binbuf[n]= binbuf[n]+'0' // + 30h Versatz im ASCII-Code
byte=byte>>1; // nächstes Bit
}
binbuf[8]=0; // Buffer nullterminieren
return(binbuf);
}
// Testprogramm
#include <stdio> // für printf()
void main(void)
{
printf("%s", bintoa(0x9A));
}
|
||
|
Das obige Beispiel legt den Buffer für den nullterminierten String auf dem Heap an, so dass der erstellte String auch verfügbar bleibt, wenn die Funktion beendet ist. Normale Variable von Unterprogrammen werden auf dem Stack abgelegt und verschwinden von dort wieder, wenn die Funktion beendet wird. Das wäre für den zurückzugebenden String nicht sinnvoll. Da die Laufvariable n der for-Schleife von 7 nach 0 zurückgezählt wird, muss bei dem Vergleich n<=0 gewährleistet sein, dass nach der 0 negative Zahlen folgen. Dies ist bei unsigned char nicht der Fall, die Schleife würde unendlich laufen. Da der Wertebereich von 'char' in der Voreinstellung des Compilers festgelegt ist und man diese Einstellung nicht zu jedem Zeitpunkt 'im Griff' hat, macht es Sinn, ausdrücklich vorzeichenbehaftete Werte zu verlangen, was durch 'signed char' geschieht. Nun ist die Einstellung des Compilers unbedeutend. Ansonsten arbeitet das Programm den Wert in 'byte' vom niedrigsten Bit zum höchsten Bit ab, erstellt durch die Addition von 30h den ASCII-Code der 0- und 1-Werte und legt diesen von hinten nach vorne in dem Stringbuffer ab. Am Ende wird der Buffer mit 00h abgeschlossen. Das folgende Beispiel fasst diesen Prozess in einer Zeile zusammen, berücksichtigt dabei aber unterschiedliche Stringlängen. So können die letzten 4, 8, 16 Bits eines Wortes in den String übertragen werden. Beispiel 2: |
||
// bintoa()
// Der Inhalt des übergebenen Speichers 'word' vom Typ unsigned
// wird über die in 'nbit' angegebene Anzahl von Bits in einen
// ASCII -String mit den Zeichen 0 und 1 überführt. Zweckmässige
// Angaben für die Anzahl 'nbit', der auszugebenden Bits können 4,
// 8, 16 lauten. So können binäre Nibble, Bytes oder Words zur
// Ausgabe gewandelt werden.
// Die Funktion gibt einen Zeiger auf den erstellten, null-
// terminierten String zurück.
char* bintoa(unsigned word, char nbit)
{
static char binbuf[16+1];
for(char n=0; n<nbit; n++)binbuf[nbit-1-n]=((word>>n)&0x01)+'0';
binbuf[nbit]=0;
return(binbuf);
}
|
||
|
|
.de