Instruction conditionnelle en utilisant des opérateurs au niveau du Bit
Donc, je vois que cette question a déjà été posée, cependant les réponses ont été un peu vague et inutile. Ok, j'ai besoin de mettre en œuvre une c une expression en utilisant uniquement des "& ^ ~ ! + | >> <<"
L'expression doit ressembler à:? b : c
Donc, de ce que j'ai pu dire, l'expression des besoins à ressembler à quelque chose comme:
return (a & b) | (~a & c)
Cela fonctionne lorsque a = 0, car anding avec b donnera à zéro, puis la ou l'expression sera de retour le côté droit, (~a & c)
qui fonctionne parce que ~0 donne à tous ceux, et anding c avec tous ceux retourne c.
Toutefois, cela ne fonctionne pas lors d'un > 0. Quelqu'un peut-il essayer d'expliquer pourquoi il en est, ou comment résoudre le problème?
OriginalL'auteur atb | 2012-04-05
Vous devez vous connecter pour publier un commentaire.
Je voudrais convertir
a
à une valeur booléenne à l'aide de!!a
, pour obtenir 0 ou 1.x = !!a
.Alors je vous nier que, en complément à deux. Puisque vous n'avez pas unaire moins disponible, vous utilisez la définition de complément de 2 négation: inverser les bits, puis ajouter une:
y = ~x + 1
. Qui va lui donner tous les bits clair, ou tous les bits définis.Alors j'avais
and
directement avec une variabley & b
, son inverse avec l'autre:~y & c
. Qui donnera un 0 pour l'une des expressions, et la variable d'origine pour les autres. Lorsque nousor
ensemble, le zéro n'a aucun effet, donc nous allons obtenir la variable d'origine, inchangé.Si nous avons commencé avec 0, alors inverser les bits donne à tous. Lorsque nous ajoutons une, de toutes les personnes de retour à zéro (et les bagages se définir, mais on l'ignore). Si nous avons commencé avec 1, en feuilletant les bits donne 111...10. L'ajout de 1 se transforme cette dernière de 0 à 1, de sorte que tous les bits sont à 1.
le
y = ~x + 1
partie m'a confus; j'ai enfin compris travaux pour cause de dépassement d'entier dans le cas où x = 0, mais ce n'est pas évident. Le plus clair pour moi, la solution a été pour la première équipe à msb lsb avec décalage à gauche (00000001 => 10000000) et ensuite copier esm avec la touche maj droite:y = (x << 31) >> 31
OriginalL'auteur Jerry Coffin
En d'autres termes, vous avez besoin
a
d'avoir tous les bits mis à 0, si a estfalse
(c 0), et ont tous les bits mis à 1, sia
est vrai (c'est à direa > 0
).Pour le premier cas, le travail est déjà fait pour vous; pour le dernier -- essayer de travailler sur la suite de l'expression
~!1
.OriginalL'auteur George Skoptsov