@Crush und nic_power: Bleibt bitte beim Thema. Oder macht im Sonstige-Forum einen neuen Thread auf, so was wie "Die bizarre Schönheit der Assemblersprache im Wandel der Architekturen"
@blast:
Unsere beiden Assembler-Freaks haben jetzt zwar technisch bis ins kleinste erklärt, was bitweises Schieben ist, aber ein Aspekt ist bisher IMO zu kurz gekommen: Was das ganze soll.
Bitweises Schieben bedeutet, bei einer Zahl im Dualsystem alle Stellen nach links oder rechts zu verschieben. Das ändert den Wert immer um den Faktor zwei bzw. 1/2 (je nach Schieberichtung).
10 << 1 ergibt 20
10 >> 1 ergibt 5
10 << 2 ergibt 40
10 >> 2 ergibt 2
Im letzten Fall zeigt sich die Besonderheit, dass Bits, die aus dem Wertebereich der Zahl "herausgeschoben" werden, verloren sind. Das gilt auch für das obere Ende.
Man könnte also auch einfach *2 bzw /2 (oder 4, 8, usw.) schreiben. Ein Beispiel, bei dem Schieben sinnvoller ist als Multiplizieren:
unsigned long l = 123456;
for( int b = 0; b <= 31; b++ ) {
if( l & ( 1 << b ) ) {
printf( "Bit %d ist gesetzt\n", b );
}
}
[/CODE]
Wenn man nicht mit Schieben arbeitet, wird das Ausrechnen der Zweierpotenz schwieriger, weil man in einer Schleife multiplizieren muss:
[CODE]
unsigned long l = 123456;
for( int b = 0; b <= 31; b++ ) {
unsigned long zweierpotenz = 1;
for( int i = 0; i < b; i++ ) {
zweierpotenz *= 2;
}
if( l & zweierpotenz ) {
printf( "Bit %d ist gesetzt\n", b );
}
}
Alternativ könnte man auch eine Potenzfunktion aus einer mathematischen Bibliothek einbinden. Das wäre aber unter der Haube auch nicht besser als die Multiplikationsschleife.