PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu Bitverschiebung



°Light°
01.06.2010, 19:50
Hallo zusammen da ich ja C / C + + lernen will habe ich mir ein Buch besorgt in dem (fast)alles zimlich gut erklärt wird doch bin ich auf eine Formel gestoßen die ich nicht verstehe.

Ich sollte als Aufgabe den ganze ASCII-Zeichensatz als eine Tabelle (siehe hier (http://img215.imageshack.us/img215/2853/unbenanntgz.png)) darstellen.

Hier die Lösung dazu:
#include <stdio.h>
#include <conio.h>


int main(int argc, char *argv[])
{
unsigned char zeichen;
int zeile, spalte, i;

printf(" ");
for (i = 0; i < 8; i = i+1)
printf(" %c ", '0' + i);
printf("\n");

for (zeile = 0; zeile < 16; zeile = zeile + 1)
{
if (zeile < 10)
printf("%c", '0' + zeile);
else
printf("%c", 'a' - 10 + zeile);

for (spalte = 0; spalte < 8; spalte = spalte + 1)
{
zeichen = (spalte << 4) | zeile;
if((zeichen >= 0x20) && (zeichen <= 0x7e))
printf(" %c ", zeichen);
else
printf(" . ");
}

printf("\n");
}

printf("\nDie Punkte dienen als Ersatzzeichen der nichtdruckbaren Zeichen");

getch();
}



So zum ausrechnen der einzelnen Zeichen ergibt sich die
Formel: "zeichen= 16*spalte + zeile" so bist dahin ist alles klar nun stellt mein Buch die Formel so da: "zeichen = (spalte << 4) | zeile"
und genau das verstehe ich nicht, wie ich von der einfachen Formel auf diese komme. Durch die Pfeile wird ja um 4 Bit die spalte nach links verschoben aber was bringt mir das ^^ ? Wäre echt cool wenn das hier einer versteht und mir erklären kann.

MfG °light°

AlterHacker
01.06.2010, 19:54
Hey,

Ich hab mir zwar jetzt nicht alles angeguckt aber ein Shift Left um 1 bringt eine multiplikation um 2. (Geht schneller als *2)
Also
wert << 1 // = *2
wert << 2 // = *4
wert << 3 // = *8
wert << 4 // = *16

Warum kannst du dir denken? Wenn nicht schau dir mal das Binär-System an

Ach ja und das | ist quasi die Addition

Da das eine um 4 bits verschoben wurde, sieht es (für zeile =15, also im extremfall) so aus:
XXXX0000 | 00001111 => XXXX1111
D.h. in diesem Fall kann man das | als Additionsoperator benutzten.

Wenn das nicht im Buch steht, find ich das Buch nicht so gut für absolute anfänger geeignet.


MfG

GregorSamsa
01.06.2010, 19:56
Recht Simpel: 00000001

Zer0Flag
01.06.2010, 20:07
Recht Simpel: 00000001

Ich vervollständige das mal :

|21:02:29| |+GregorSamsa| da soll stehen:
|21:02:42| |+GregorSamsa| 00000001 << 4 = 00010000
|21:02:46| |+GregorSamsa| 00000001 = 1
|21:02:50| |+GregorSamsa| 00010000 = 16


~Zer0Flag

°Light°
01.06.2010, 20:43
Hey,

Ich hab mir zwar jetzt nicht alles angeguckt aber ein Shift Left um 1 bringt eine multiplikation um 2. (Geht schneller als *2)
Also
wert << 1 // = *2
wert << 2 // = *4
wert << 3 // = *8
wert << 4 // = *16

Warum kannst du dir denken? Wenn nicht schau dir mal das Binär-System an

Ach ja und das | ist quasi die Addition

Da das eine um 4 bits verschoben wurde, sieht es (für zeile =15, also im extremfall) so aus:
XXXX0000 | 00001111 => XXXX1111
D.h. in diesem Fall kann man das | als Additionsoperator benutzten.

Wenn das nicht im Buch steht, find ich das Buch nicht so gut für absolute anfänger geeignet.


MfG


und woher weis ich als anfänger wann das | als aditionsoperatro und wann es als "bitweises oder" verwendent wird ?

PS: So ne frage warum kann ich schon den ganzen tag mit firefox keine thread oder antworten schreiben ? geht iwie nur mit IExploer ^^

AlterHacker
01.06.2010, 20:53
Es wird als Bit-OR benutzt, nur in diesem Fall hats den Effekt eines '+' quasi.
Warum?
0 | 0 = 0
0 | 1 = 1
1 | 1 = 1
Also bsp:
11110000 OR
00001010 =
11111010

Wenn die Bits schon gesetzt wären, wird nichts addiert weil 1 or 1 = 1, also wird da nichts mehr.
Da aber die 4 kleinen Bits aufgrund des 4fach-Shifts immer 0 sind, und die Bits für die spalte nur in den ersten 4 bits sind (weil 15 = alle 4 bits 1 ) wäre es im schlimmsten fall:

11110000 ( Für Zeile ) OR
00001111 ( Für Spalte) =
11111111
=> Die beiden "Bitmuster" überschneiden sich nicht => 100% Addierung


So far


P.s.:
Schreib sowas nicht in deinem Code! Und wenn dus machst (Weil zeitkritische Funktion oder so) kommentiere es ausreichend! Sonst verstehst du's / wer anders der sich den Code anguckt später nicht mehr.

°Light°
01.06.2010, 21:00
ah jetz okay habs soweit verstanden schade das das so nicht im buch stand naja werde mir vl ein anders bald besorgen.
Danke an alle für die Hilfe

AlterHacker
01.06.2010, 21:07
Gut, dass es bei F-H keinen THX-Knopf gibt weil man sonst in versuchung käme, diesen zu drücken ^^.