Trouver mathématiquement la valeur maximale sans comparaison conditionnelle
----------Mise à jour ------------
codymanix et moonshadow ont été d'une grande aide à ce jour. J'ai pu résoudre mon problème en utilisant les équations et au lieu d'utiliser la touche maj droite j'ai divisé par 29. Car avec 32bits signé 2^31 = déborde à 29. Qui fonctionne!
Prototype en PHP
$r = $x - (($x - $y) & (($x - $y) /(29)));
Code de CONDUIT (vous ne pouvez faire qu'une fonction mathématique PAR LIGNE!!! AHHHH!!!)
DERIVDE1 = IMAGE1 - IMAGE2;
DERIVED2 = DERIVED1 /29;
DERIVED3 = DERIVED1 AND DERIVED2;
MAX = IMAGE1 - DERIVED3;
----------Question D'Origine-----------
Je ne pense pas que c'est tout à fait possible avec mon application limitations, mais j'ai pensé que ça vaut le coup de demander.
Je vais essayer de faire ce simple. J'ai besoin de trouver les valeurs maximales entre deux nombres sans être en mesure d'utiliser un SI ou de toute instruction conditionnelle.
Afin de trouver le MAX de valeurs que je ne peut exécuter les fonctions suivantes
Divide, Multiply, Subtract, Add, NOT, AND ,OR
Disons que j'ai deux numéros de
A = 60;
B = 50;
Maintenant, si l'Un est toujours plus grand que B, il serait simple de trouver la valeur max
MAX = (A - B) + B;
ex.
10 = (60 - 50)
10 + 50 = 60 = MAX
Problème de est Une est pas toujours supérieure à B. je ne peux pas effectuer ABS, MAX, MIN ou conditionnelle vérifie avec le script application que j'utilise.
Est-il possible à l'aide de l'opération limitée ci-dessus pour trouver une valeur TRÈS proche du max?
source d'informationauteur Almost Famous
Vous devez vous connecter pour publier un commentaire.
trouver le maximum de 2 variables:
max = a-((a-b)&((a-b)>>31))
où >> est au niveau du bit décalage vers la droite (également appelé SHR ou l'ASR selon ce paramètre).
Au lieu de 31 vous utilisez le nombre de bits de vos numéros ont moins un.
Je suppose que ce serait plus simple si nous parvenons à trouver la différence entre deux nombres (seulement de l'ampleur signe pas)
où
|a-b|
est d'une magnitude de la différence entrea
etb
.Si vous ne pouvez pas faire confiance à votre environnement pour générer de l'appropriées sans branches opérations lorsqu'elles sont disponibles, voir cette page pour la façon de procéder. Remarque la restriction sur la plage d'entrée; utiliser un plus grand nombre entier de type pour l'opération si vous ne pouvez pas garantir des apports ajustement.
Solution sans conditions. Fonte à uint puis retour à l'int d'obtenir abs.
L'aide d'opérations logiques seulement, court-circuit de l'évaluation et en supposant que le C de la convention de l'arrondi vers zéro, il est possible d'exprimer ce que:
L'idée de base est de mettre en œuvre un opérateur de comparaison qui renvoie 0 ou 1. Il est possible de faire une astuce similaire si votre langage de script suit la convention de l'arrondi vers le plancher de la valeur comme le python n'.
Hmmm. Je suppose que NON, ET et OU bit-à-bit? Si oui, il va y avoir un bit à bit expression de résoudre ce problème. Noter que A | B donnera un certain nombre >= et >= B. peut-être il y a un mode de taille pour la sélection du nombre avec le plus de bits.
Pour étendre, nous avons besoin des éléments suivants pour déterminer si Un (0) ou B (1) est plus grande.
table de vérité:
donc, va donner de l'indice de la plus grande peu. Ergo, comparer chaque bit à la fois en nombre, et quand ils sont différents, utiliser l'expression ci-dessus (Pas de A Et B) pour déterminer le nombre était plus grande. Commencer à partir de l'octet le plus significatif et continuer vers le bas de deux octets. Si vous n'avez pas de structure de boucle, de les comparer manuellement chaque bit.
La mise en œuvre de "quand ils sont différents":
(A != B) ET (ma logique ici)
essayer, mais sachez que pour les dépassements)
(Le Code en C#)
Vous pouvez exprimer ce que d'une série de l'arithmétique et des opérations bit à bit, par exemple:
veuillez jeter un oeil à ce programme.. cela pourrait être la meilleure réponse à ce jour sur cette page...
Ça dépend de la langue que vous utilisez, mais les Opérateur Ternaire pourrait être utile.
Mais alors, si vous ne pouvez pas effectuer conditionnelle vérifie dans votre script de l'application', vous n'avez probablement pas l'opérateur ternaire.
Pas besoin. Utilisez simplement:
int maxA(int A, int B){ return A;}
(1) Si les conditions sont autorisés à vous faire
max = a>b ? a : b
.(2) Toute autre méthode, soit l'utilisation d'un ensemble de nombres ou de s'appuyer sur l'implicite conditionnelle contrôles.
(2a)
max = a-((a-b)&((a-b)>>31))
c'est soigné, mais il ne fonctionne queif
vous utilisez 32 bits. Vous pouvez l'agrandir arbitraire grand nombre N, mais la méthode échoue si vous essayez de trouver le max(N-1, N+1). Cet algorithme fonctionne pour les automates d'états finis, mais pas un Réglage de la machine.(2b) de l'Ampleur
|a-b|
est une condition|a-b| = a-b>0 a-b : b-a
Ce sujet:
Racine carrée est aussi une condition. Chaque fois que
c>0
etc^2 = d
nous avons seconde solution-c
parce que(-c)^2 = (-1)^2*c^2 = 1*c^2 = d
. Racine carrée retourne le plus grand de la paire. Je vient avec un build dansint max(int c1, int c2){return max(c1, c2);}
Sans opérateur de comparaison de mathématiques est très symétrique, ainsi que dans l'alimentation. Les nombres positifs et négatifs ne peuvent pas être distingués sans
if
de quelque sorte.