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
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
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) {
...
}
Merci, très apprécié –
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 +
.
Si N_half est un entier positif ou non signé, il le divise par deux.
En fait, cela fonctionne également si N_half est négatif. –
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. –
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
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:
Vous devez revoir le code original - il n'appelait pas 'floor', et la fonction qu'il appelait prenait y comme argument supplémentaire. –
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). –
Et 'floor()' est une fonction à virgule flottante ... –
>> = 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.
??? 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
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. –
Ah: un opérateur surchargé. Je n'ai jamais rencontré ce type de surcharge pour >>. THX. – abelenky
Comment est-ce lié aux bits et bit -déplacement? –
Parce que c'est le comportement de l'opérateur OP demande à propos de. – chaos