La fonction update: strong> juste pour être clair, ce n'est pas des devoirs ou un problème xy où suggérant copy_bit code> ci-dessous est simplifiée en quelque chose comme
out [OUT_BIT] = dans [in_bit] code>? (c.-à-d. ne pas utiliser de
si code> instruction)
std :: bitset code> répond à la question. p> p>
3 Réponses :
Vous pouvez le faire comme ça comme ceci comme suit:
//Change the bit if and only if they are not equal: out ^= (((out >> out_bit) ^ (in >> in_bit)) & 1) << out_bit;
Points bonus Si vous pouvez profiler cela et comparer avec le code d'origine (il est difficile de voir pourquoi OP apporte cette demande à moins qu'il ne pense qu'il peut surpasser son compilateur pour des gains de performance)
J'ai fait la partie difficile, laissez quelqu'un d'autre faire le profilage (:. de toute façon que la demande était de simplifier le code de ne pas l'optimiser.
Je ne suis pas sûr que beaucoup de gens considèrent que cela plus "simple" que le code d'origine :)
Essayez ceci: explication: p>
(out & ~ (1 << OUT_BIT)) CODE> Laissez les bits de
out code> qui ne sont pas intéressants. LI>
(dans & (1 << in_bit) code> Sélectionnez le bit de
dans code> qui est intéressant li>
(((dans & (1 << in_bit)) >> in_bit) << OUT_BIT) CODE> Positionnez le bit dans la bonne position. LI>
ul> p>
Bonne explication, mais ((((dans & (1 << in_bit)) >> in_bit) << OUT_BIT) CODE> pourrait être simplifié à
(((((dans >> in_bit) et 1) <
Un moyen de le faire dans une ligne serait de réinitialiser d'abord le bit de sortie à zéro, puis ou avec n'importe quel bit le numéro dans code> est:
Trop d'opérateurs d'affectation composés; Il est très difficile de prouver que cela a un comportement indéfini.
Oui, je suis moi-même confondu avec des points de séquence. Je crois que ma réponse pourrait effectivement avoir un comportement indéfini.
en C ++ 03, il a sûrement un comportement non défini (deux missions à la même variable sans point de séquence intermédiaire), bien que cela soit facilement fixé en n'utilisant pas l'affectation du composé
Eh bien, nous ne nous soucions pas de devoirs. Nous devrions simplement résoudre le problème pour de vraies applications.
@Reeegavirel Vous avez raison, mais je voulais dire cette partie avec
out [Out_bit] = dans [in_bit] code>. Est-il possible de le faire directement?
@ALIREZA:
OUT [OUT_BIT] = Dans [in_bit] code> n'implique pas que les bits doivent être modifiés directement, car en C ++, vous pouvez surcharger
opérateur [] code>.
Non mentionné n'importe où encore, mais un comportement non défini est causé par
1 << in_bit code> si
in_bit> = char_bit * Taille de (int) code> quel que soit
t code>; Pensez à faire
static_cast (1) code>, et si
t code> peut être signé puis de jeter à la version non signée de
t code>
+1 pour mentionner le problème xy :)