Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » c source ausschnitt

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
02.01.2004, 11:59 Uhr
kllow



kann mir jemand kurz diesen source ausschnitt erklären?

Code:
void zeig_binaer ( unsigned int Zahl )
{

int i;
for ( i = 7 ; i >= 0 ; i--)
{

if ( Zahl&(1<<i)) printf ("1");
else printf ("0");
}
printf ("\n");
}



i weis das er ne dez in binär wandelt aber i versteh net ganz wie das vor sich geht...und die bedingung in der if anweisung ... mit der komm i au net ganz klar
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.01.2004, 12:12 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



C++:
void zeig_binaer ( unsigned int Zahl ){
int i;
for ( i = 7 ; i >= 0 ; i--){    von i=7 bis i=0 wobei i in schritten von 1 dekrementiert wird
    if ( Zahl&(1<<i)) printf ("1");// schreibe eine 1 wenn das bit an stelle i 1 ist sonst eine 0
    else printf ("0");
    }

printf ("\n");
}
//1<<i dies shiftet die zahl im i stellen nach links, ist alos das gleich wie multiplizieren von 1 mit 2^i
//Zahl&(1<<i) bitweises verunden von Zahl mit i^2 heisst also das wenn in zahl das ite bit gesetzt ist kommt true raus sonst false



ist eigentlich nicht besonders schlau das nur von 7 bis 0 laufen zu lassen. besser wäre sowas wie 8*sizeof(unsigned int) zu verwenden....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.01.2004, 16:18 Uhr
Pablo
Supertux
(Operator)


Ich würde sagen, das 1 << i ist was am meisen Probleme bereitet, oder?
Das heißt Shiften (Windalf hat das schon erklärt) und das ist ein Trick, die man benutzt um Bits zu filtieren. In diesem Fall ist 1 << i ein Filter und mit & lässt nur gesetzte Bits (Bits mit dem Wert 1) durch.

Die Binäercodiereung einer Dezimalzahl, oder Octal oder Hexadecimal Zahl ist die Interpretation der Zahl aber mit nur 2 Ziffern, 0 und 1. In unserem Zahlensystem haben wir 10 Ziffern zur Verfügung, von 0 bis 9, aber Computer kennen nun mal 2, 0 und 1 oder V_IL (~ 0.8 V) und V_IH (~2 V) (mit VCC=5 Volt). Das heißt die Zahlen befinden sich schon in Binäercodieren für den Computer und das nutzt der Algorithmus aus.

Die Zahl 1 ist ein Folge von 0 und 1. Wenn man mit 32 Bit die Zahlen kodiert, dann hat die 1 31 Nullen und eine einzige 1. Also sieht sie so aus:
00000...00001.
Das Shiften geht entweder von links oder von rechts und bedeutet, dass man den ganzen Block nach links oder nach rechts bewegen soll und die leeren Stellen mit 0 gefüllt werden müssen. In C/C++ lässt sich mit << und >> shiften. << ist nach links und >> nach rechts.
Das heißt: 1 << 1 ist bewege alles nach 1 um ein Bit.
0000...0001 << 1 == 0000..000010 (=2=2^1)
0000...0001 << 2 == 0000..000100 (=4=2^2)
0000...0001 << 3 == 0000..001000 (=8=2^3) usw
0000...0001 << i == 0000..0010..0000 (=2^i)
& ist Bitweise AND Operator, das heißt 1 kommt raus, wenn beide Zahlen 1 sind. Da die Maske (1 << i ) nur eine einzige 1 hat, kann man damit die einsen der Zahl Zahl filtieren, da sie sich nie bewegt.

C++:
#include <stdio.h>
int main(int argc, char** argv)
{
        printf("%d\n", 1 << atoi(argv[1]));
        return 0;
}



Führe das Programm aus (bsp: test 3) mit einem Argument zwischen 0 und 32 aus. Dann bekommst du nur die 2er Potenzt des Argumentes.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 02.01.2004 um 16:21 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.01.2004, 18:28 Uhr
kllow



thx für die ausfühliche erklärung
habs jetzt geschnallt was es bewirkt und bedeutet
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: