2009-07-02 9 views
1

confus quant à ce code neQue fait cette ligne de code?

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

En particulier, cette "N_half >> = 1"

Merci

+0

Comment est-ce lié aux bits et bit -déplacement? –

+1

Parce que c'est le comportement de l'opérateur OP demande à propos de. – chaos

Répondre

9

Il avance la boucle en divisant N_half par deux à chaque itération. Il est équivalent à:

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

Merci, très apprécié –

5

N_half>>=1 effectue une par 2. décalage à droite au niveau du bit 1 de place sur N_half, qui (pour les nombres non négatifs) divise

>>= est à >> comme += est de +.

0

Si N_half est un entier positif ou non signé, il le divise par deux.

+0

En fait, cela fonctionne également si N_half est négatif. –

+0

RaphaelSP - il n'y a pas de standard qui indique que la notation de complément à deux doit être utilisée. C'est seulement garanti pour travailler pour des nombres non signés et positifs, AFAIK. –

0

Il se déplace droit N_half par 1 (par exemple le divise par deux) et stocke le résultat de retour dans N_half

0

Cela semble être le même que

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

La question a été reformulée depuis que je répondais il, de sorte que ce ne soit plus valable, mais il a ajouté complet: Si rien d'autre se fait dans la boucle, il est équivalent à:

N_Half >>= levels; 

Avertissements:

  • si N_Half < 2^niveaux (0 pour plusieurs itérations)
  • si N_Half < 0 (premier RightShift sera en fonction de la mise en œuvre en font un nombre positif)
+0

Vous devez revoir le code original - il n'appelait pas 'floor', et la fonction qu'il appelait prenait y comme argument supplémentaire. –

+0

De même, le comportement du décalage vers la droite sur les valeurs négatives (donc forcément signées) n'est pas garanti pour convertir la valeur en positive.Le standard C le laisse explicitement à l'implémentation et le décalage peut copier le bit de signe ou insérer des zéros; les deux sont corrects (bien qu'un compilateur donné ne puisse utiliser que l'une ou l'autre technique). –

+0

Et 'floor()' est une fonction à virgule flottante ... –

1

>> = quarts de travail de l'opérateur chiffres de k positions de nombre à droite

exemples:

forme binaire

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

forme décimale

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

comme d'habitude , les numéros en mémoire sont sous forme binaire et >> = 1 est équivalent à une division par 2.

+0

??? Comment ">> = 2" division par 100? Votre exemple avec une représentation décimale n'a aucun sens pour moi. Précisez s'il vous plaît? – abelenky

+0

C'est l'opération de décalage sous la forme décimale. Pas binaire. Vous ne pouvez pas l'appliquer avec 'standard' >> = sauf si vous avez une classe pour les nombres décimaux. Ex. 345 >> 1 est 345/10, 345 >> 2 est (345/10)/10. –

+0

Ah: un opérateur surchargé. Je n'ai jamais rencontré ce type de surcharge pour >>. THX. – abelenky