Différences entre les versions de « Les opérations bit à bit/Le branch-free code »

m
m
return b ^ ( (a ^ b) & -(a > b) ) ;
}
</syntaxhighlight>
 
==Appliquer un masque sous condition==
 
Appliquer un masque sur un nombre permet de mettre à 1 les bits choisit, ou alors de les mettre à zéro. On peut vouloir faire l'un ou l'autre selon si une condition bien précise est remplie : on met à 1 les bits si la condition est remplie, à 0 sinon. Le code qui correspondrait serait celui-ci :
 
<syntaxhighlight lang="c">
bool f; // Résultat de la condition
unsigned int m; // Le masque
unsigned int w; // Nombre à maquer
 
if (f)
{
w |= m ; // mettre à 1 les bits voulus
}
else
{
w &= ~m ; // mettre à 0 les bits voulus
}
</syntaxhighlight>
 
Il existe deux solutions sans branchements. La première est celle-ci :
 
<syntaxhighlight lang="c">
bool f; // Résultat de la condition
unsigned int m; // Le masque
unsigned int w; // Nombre à maquer
 
w ^= (-f ^ w) & m;
</syntaxhighlight>
 
Une solution équivalente serait la suivante :
 
<syntaxhighlight lang="c">
bool f; // Résultat de la condition
unsigned int m; // Le masque
unsigned int w; // Nombre à maquer
 
w = (w & ~m) | (-f & m);
</syntaxhighlight>
 
38 065

modifications