[Mini-challenge] Normaliser la sortie d'une comparaison. - Version imprimable +- N-PN White-Hat Project (https://dev.n-pn.fr/forum) +-- Forum : Communauté (https://dev.n-pn.fr/forum/forumdisplay.php?fid=10) +--- Forum : Le bistrot (https://dev.n-pn.fr/forum/forumdisplay.php?fid=17) +--- Sujet : [Mini-challenge] Normaliser la sortie d'une comparaison. (/showthread.php?tid=3767) |
[Mini-challenge] Normaliser la sortie d'une comparaison. - b0fh - 27-09-2014 Dans la libc, la fonction strcmp(a,b) compare deux strings, et retourne une valeur négative, nulle ou positive suivant que a est plus petit, égal, ou plus grand que b. Cette convention a été choisie parce qu'elle donne lieu a une implémentation très efficace, qui consiste a retourner la différence entre la première paire de caractères non-égaux: Code : int strcmp(char *a, char *b) { Dans certains cas, il peut être désirable de normaliser la sortie de cette fonction, c'est a dire de transformer toutes les valeurs positives en +1, et toutes les valeurs négatives en -1. Challenge: réalisez cette transformation sans utiliser de structures de contrôle, ni opérateurs impliquant des sauts (&&, ||, ?: ) ! Le code doit marcher quelle que soit la taille effective du type int. EDIT: corrigé une typo, c'était *a - *b et pas a - b évidemment, merci Kiwazaru Résolu par: (personne pour l'instant) RE: [Mini-challenge] Normaliser la sortie d'une comparaison. - wapiflapi - 27-09-2014 Code : (s > 0) - (s < 0) Exemple de cas ou c'est utile ? RE: [Mini-challenge] Normaliser la sortie d'une comparaison. - Atlas - 27-09-2014 ça aurait été mieux que tu réponde la solution par mp , ça nous aurait permis de chercher par nous même . RE: [Mini-challenge] Normaliser la sortie d'une comparaison. - Kiwazaru - 27-09-2014 En théorie, la solution de wapiflapi ne fonctionne pas dans le cadre autorisé (c-à-d aucun jumps). En effet, la solution d'obtenir le retour d'une vérité dynamiquement pour obtenir le résulat voulu fait appel a une instruction x86 nommée SET+G (SETG), qui vérifie si c'est supérieur (pour la première vérité dans le cas donné). Ainsi, avec un peu de recherche on remarque que l'algorithme utilisé pour mener à bien cette instruction est le suivant: Code : SI condition ALORS Bien sûr, la solution reste très intelligente, mais ne respecte théoriquement pas les demandes. Tu peux donc continuer à chercher une solution, (MacYavel en a une autre), et moi je suis sur une piste. Il n'existe pas qu'une seule solution RE: [Mini-challenge] Normaliser la sortie d'une comparaison. - gruik - 29-09-2014 (27-09-2014, 17h45)Kiwazaru a écrit : le résulat voulu fait appel a une instruction x86 nommée SET+G (SETG) ce serait pas JG (jump if greater) et son pendant JB (jump if below) plutôt ? RE: [Mini-challenge] Normaliser la sortie d'une comparaison. - wapiflapi - 29-09-2014 (29-09-2014, 07h30)gruik a écrit :(27-09-2014, 17h45)Kiwazaru a écrit : le résulat voulu fait appel a une instruction x86 nommée SET+G (SETG) Non ca fait bien appel a setg. Par contre ce n'est pas un branchement, c'est pas parce-que l'explication d'une instruction inclue un if que l'instruction fait un branchement. Sinon n'importe quelle instruction ferais des branchement, eg: XOR 1 si l'un ou l'autre mais pas les deux SINON 0. RE: [Mini-challenge] Normaliser la sortie d'une comparaison. - b0fh - 29-10-2014 |