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. |