, 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
, 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
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) {
...
}
Danke, sehr geschätzt –
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 +
.
Wenn N_half eine positive oder vorzeichenlose Ganzzahl ist, wird sie halbiert.
Eigentlich funktioniert es auch, wenn N_half negativ ist. –
RaphaelSP - Es gibt keinen Standard, der angibt, dass die Zweierkomplement-Notation verwendet werden muss. Es funktioniert nur für unsignierte und positive Zahlen, AFAIK. –
Es verschiebt rechts N_half von 1 (dh teilt es durch zwei) und speichert das Ergebnis zurück in N_half
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:
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. –
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). –
Und 'floor()' ist eine Gleitkommafunktion ... –
>> = 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.
??? Wie ist ">> = 2" Division durch 100? Ihr Beispiel mit dezimaler Darstellung ergibt für mich keinen Sinn. Bitte klären Sie? – abelenky
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. –
Ah: ein überladener Operator. Ich habe diese Art der Überladung für >> nie erlebt. Danke. – abelenky
Wie dies Bits bezieht und bit -Verschiebung? –
Das ist das Verhalten des Operators, nach dem OP fragt. – chaos