Opérations bit à bit équivalentes à supérieures à l'opérateur
Je suis en train de travailler sur une fonction qui sera essentiellement de voir lequel des deux entiers est plus grande. Les paramètres qui sont passés de 2 à 32 bits entiers. Le truc, c'est les seuls opérateurs autorisés sont ! ~ | & << >> ^ (pas de casting, d'autres types de données en plus de signé int, *, /, -, etc..).
Mon idée pour l'instant est à ^ les deux fichiers binaires et de voir tous les postes de l'1 valeurs qu'ils ne partagent. Ce que je veux faire, c'est alors que prendre de la valeur et d'isoler le 1 le plus à gauche. Puis de voir qui d'entre eux a cette valeur. Cette valeur sera alors la plus grande.
(Dites-nous utiliser 8 bits entiers au lieu de 32 bits)
si les deux valeurs transmises ont été 01011011 et 01101001
J'ai utilisé ^ sur eux pour obtenir 00100010.
Je veux la faire 00100000 en d'autres termes 01xxxxxx-> 01000000
Puis & avec le premier numéro de
!! le résultat et de le retourner.
Si il est à 1, alors le premier # est plus grande.
Des idées sur la façon de 01xxxxxx->01000000 ou quoi que ce soit d'autre pour l'aider?
Oublié de noter: pas d'ifs, alors, fors etc...
source d'informationauteur Gekctek
Vous devez vous connecter pour publier un commentaire.
Voici une boucle-la version gratuite qui permet de comparer des entiers non signés en O(lg b) opérations, où b est le mot de la taille de la machine. Note de l'OP unis pas d'autres types de données que
signed int
il semble donc probable que la partie supérieure de cette réponse ne satisfait pas aux OP du cahier des charges. (Spoiler version comme en bas.)Noter que le comportement que nous voulons capturer, c'est quand le bit le plus significatif décalage est
1
poura
et0
pourb
. Une autre façon de penser à ce sujet est quelque peu ena
étant plus grand que le bit correspondant dansb
signifiea
est plus grand queb
tant qu'il n'y avait pas un peu plus tôt dansa
c'était moins que le bit correspondant dansb
.À cette fin, on calcule tous les bits
a
plus grande que les bits correspondants dansb
et même de calculer tous les bits dea
moins que les bits correspondants dansb
. Nous voulons maintenant pour masquer tous les 'plus grand que' bits qui sont en dessous de tout "pour le moins" des bits, de sorte que nous prenons tous les "pour le moins" des bits et des frottis tous à le droit de faire un masque: le bit le plus significatif de tout le chemin vers le bas pour le bit le moins significatif sont maintenant1
.Maintenant tout ce que nous avons à faire est de retirer le "plus grand que" les bits définis à l'aide de simples bits de masquage de la logique.
La valeur est 0 si
a <= b
et différente de zéro sia > b
. Si nous voulons qu'elle soit1
dans ce dernier cas, nous pouvons faire de même bavures truc et il suffit de prendre un coup d'oeil au bit le moins significatif.Remarque: Cela devrait fonctionner pour les entiers signés ainsi si vous retournez le haut peu sur les deux des entrées, par exemple
a ^= 0x80000000
.Spoiler
Si vous voulez une réponse qui répond à toutes les exigences (y compris les 25 opérateurs ou moins):
Je vais le laisser en expliquant pourquoi il fonctionne jusqu'à vous.
Un unsigned variante étant donné qu'on peut utiliser la logique (&&, ||) et de comparaison (!=, ==).
!=
et==
peuvent facilement être éliminés., c'est à dire:Pour connecté on pourrait alors étendre à quelque chose comme:
Peut être plus compact /éliminer ops. (au moins un), mais de le mettre comme ça pour plus de clarté.
Au lieu de
0x80000000
l'on puisse dire c'est à dire:À l'aide de ce test:
Résultat:
Pour convertir
001xxxxx
à00100000
vous devez d'abord exécuter:(c'est pour les 8 bits; de l'étendre à 32, ajouter des quarts de travail de 8 et 16 ans au début de la séquence).
Ce qui nous laisse avec
00111111
(cette technique est parfois appelée la "bit-bavures"). On peut alors couper tous, mais le premier bit à 1:nous laissant avec
00100000
.Entièrement sans branches version de Kaganar petits isGt fonction pourrait ressembler à de la sorte:
Ce horloges à environ 60 instructions pour le calcul (MSVC 2010 compilateur, sur les architectures x86), plus un supplément de 10 pile ops ou alors pour la fonction du prologue/épilogue.
EDIT:
Ok, il y a eu quelques problèmes avec le code, mais j'ai révisé et les œuvres suivantes.
Cette fonction auxiliaire de comparer les nombres' n-ième chiffre significatif:
Les éléments suivants doivent récursivement renvoyer le plus grand nombre:
Autant que je ne veux pas faire de quelqu'un d'autre les devoirs, je ne pouvais pas résister à celui-ci.. 🙂 je suis sûr que d'autres peuvent penser d'un plus compact..mais voici la mienne..fonctionne bien, y compris les nombres négatifs..
Edit: il y a quelques bugs. Je vais laisser à l'OP de le trouver et de le corriger.
Je pense avoir une solution avec 3 opérations:
Ajouter l'un pour le premier numéro, le soustraire le plus grand nombre possible vous pouvez représenter (toutes les 1 s). Ajouter ce numéro à la deuxième numéro. Si elle déborde, puis le premier nombre est inférieur à la seconde.
Je ne suis pas sûr à 100% si c'est correct. C'est que vous n'avez pas besoin d'ajouter 1, et je ne sais pas si c'est possible de contrôler le débordement (si non, alors il vous suffit de réserver le dernier bit et de tester si c'est 1 à la fin.)
EDIT: Les contraintes de faire de la simple approche à bas invalide. Je suis ajoutant le binaire fonction de recherche et la comparaison finale de détecter le plus de valeur:
L'idée est de commencer par le plus important de la moitié de la parole qui nous intéresse et de voir s'il y a des bits. Si il ya, alors nous n'avons pas besoin le moins significatif de la moitié, donc on décale les indésirables bits loin. Si non, nous ne faisons rien (la moitié est nul de toute façon, donc il ne sera pas dans le chemin). Puisque nous ne pouvons pas garder une trace de l'décalé montant (elle aurait besoin de plus), nous avons également modifier les valeurs d'origine, de sorte que nous pouvons faire la finale
and
afin de déterminer le plus grand nombre. Nous répétez ce processus avec la moitié de la taille du masque précédent jusqu'à ce que nous effondrement bits intéressants dans la position du bit 0.Je n'ai pas ajouter de l'égalité des cas ici sur le but.
Vieille réponse:
La méthode la plus simple est probablement le meilleur pour faire leurs devoirs. Une fois que vous avez le décalage des bits de valeur, vous commencez avec un autre masque à 0x80000000 (ou quel que soit approprié max bit de position de la taille de mot), et de garder le droit de l'évolution de cette jusqu'à ce que vous frappez un peu qui est définie dans votre incompatibilité de valeur. Si votre maj de droite se termine par 0, puis l'inadéquation entre la valeur est 0.
Je suppose que vous connaissez déjà la dernière étape nécessaire pour déterminer le plus grand nombre.