2009-07-02 7 views
1

, was dieser Code tutWas macht diese Codezeile? Verwirrt

for (L=0; L < levels; L++, N_half>>=1){ 
    func(y, N_half); 
} // end: levels for loop 

Insbesondere diese "N_half >> = 1"

Dank

+0

Wie dies Bits bezieht und bit -Verschiebung? –

+1

Das ist das Verhalten des Operators, nach dem OP fragt. – chaos

Antwort

9

Es geht um die Schleife durch N_half durch zwei bei jeder Iteration zu teilen. Es ist äquivalent zu:

for (L=0; L<levels; ++L, N_half=N_half/2) { 
    ... 
} 
+0

Danke, sehr geschätzt –

5

N_half>>=1 führt eine 1-place-Bitverschiebung nach rechts auf N_half, die (für nicht-negative Zahlen) es teilt durch 2.

>>= ist >> als += ist +.

0

Wenn N_half eine positive oder vorzeichenlose Ganzzahl ist, wird sie halbiert.

+0

Eigentlich funktioniert es auch, wenn N_half negativ ist. –

+0

RaphaelSP - Es gibt keinen Standard, der angibt, dass die Zweierkomplement-Notation verwendet werden muss. Es funktioniert nur für unsignierte und positive Zahlen, AFAIK. –

0

Es verschiebt rechts N_half von 1 (dh teilt es durch zwei) und speichert das Ergebnis zurück in N_half

0

Dies ist die gleiche wie

for (L=0; L < levels; L++) 
{ 
    func(y, N_Half); 
    N_Half /= 2; 
} 

Die Frage umformuliert wurde zu sein scheint, da ich beantworten es ist, so dass diese nicht mehr gültig ist, aber hinzugefügt, der Vollständigkeit halber: Wenn nichts anderes in der Schleife erfolgt, ist es gleichbedeutend mit:

N_Half >>= levels; 

Caveats:

  • wenn N_Half < 2^Ebene (0 für mehrere Iterationen)
  • wenn N_Half < 0 (erste rightshift abhängig von der Implementierung wird es schafft eine positive Zahl)
+0

Sie müssen sich den ursprünglichen Code erneut ansehen - er hat nicht "floor" aufgerufen, und die Funktion, die er aufgerufen hat, hat y als zusätzliches Argument verwendet. –

+0

Auch das Verhalten der Rechtsverschiebung bei negativen (daher notwendigerweise signierten) Werten ist nicht garantiert, um den Wert in einen positiven Wert zu konvertieren.Der C-Standard überlässt es explizit der Implementierung und die Verschiebung kann das Vorzeichenbit kopieren oder Nullen einfügen; beide sind korrekt (obwohl ein bestimmter Compiler nur die eine oder andere Technik verwenden kann). –

+0

Und 'floor()' ist eine Gleitkommafunktion ... –

1

>> = Operator verschiebt Anzahl der Ziffern k Positionen im rechten

Beispiele:

Binärform

01.235.
N = 101010111 // 2-base arithmetic system 
N >>= 1; // `division` by 2 
N: 010101011 

Dezimalform

N = 123456 // 10-base arithmetic system 
N >>= 2; // `division` by 10^2 
N: 0

als üblichen, sind die Zahlen in dem Speicher in binärer Form und >> = 1 entspricht der Division durch 2.

+0

??? Wie ist ">> = 2" Division durch 100? Ihr Beispiel mit dezimaler Darstellung ergibt für mich keinen Sinn. Bitte klären Sie? – abelenky

+0

Es ist die Verschiebung in der Dezimalform. Nicht binär. Sie können es nicht mit dem 'Standard' >> anwenden, es sei denn, Sie haben eine Klasse für Dezimalzahlen. Ex. 345 >> 1 ist 345/10, 345 >> 2 ist (345/10)/10. –

+0

Ah: ein überladener Operator. Ich habe diese Art der Überladung für >> nie erlebt. Danke. – abelenky