Partage
  • Partager sur Facebook
  • Partager sur Twitter

algorithme de comparaison

comparaison de chiffre en complement a 2

Sujet résolu
21 janvier 2010 à 21:31:11

Bonjour à tous et longue vie au forum

Voila je cherche a faire un algo
qui permettent de comparer 2 chiffres en complément à 2 sur 8 bits
pour ce qui ne conaissent pas le compelemnt à 2
c'est une représentation qui permet de considérer des chiffres positif et négatif
00000001 = 1 et 111111111= -1 tous les chiffres ayant 0 comme bit fort sont des chiffres positif dont la plus grande valeur est 127 soit en complement à 2 01111111 et si nous avons 1 comme bit fort alors c'est un chiffre négatif dont la plus grande valeur -128 soit complement à 2 10000000
bien sur comme c'est du binaire on ne represente que le chiffre par 1 et 0

On m'a dit qu'il fallait utiliser un tableau
alors voila un début d'algo mais on ne se moque pas car je débute je connais pas tres bien

Tableau A(7) , B(7) en numerique " 2 tableau contenant 8 chiffre
X, Z num " X represente le chiffre dans tableau A et Z celui du tableau B
Compteur en num
C1, C2 en boolen

C1 : A(0)= 1 "position 1 du tableau soit le bit fort"
C2 : A(i) = B(i)
compteur = 0

tant que C2 et compteur < 7
faire A(i) = A(i) + 1 "position suivante du tableau"
B (i) = A(i) + 1
compteur = compteur + 1
fin tant que
Si C1 et A(i) = 0
alors X > Z
sinon X < Z
Fin si
Si non C1 et A(i) = 0
alors X < Z
sinon X > Z
Fin si

Voila une esquisse déjà dite moi si ca vous parait correct mais le probleme si les 2 valeurs sont identiques comment faire
merci de m'aider pour l'instant je n'utilise pas de langage



  • Partager sur Facebook
  • Partager sur Twitter
22 janvier 2010 à 15:56:38

Je verrais bien quelquechose dans le genre :

Soit A et B les deux nombres que l'on souhaite comparer

// On récupère les bits de signe
S1 = A>>7
S2 = B>>7

// On teste déjà les signes si on a un nombre négatif et un positif, pas la peine d'aller plus loin
Si S1 < S2 Alors
"A > B"
Sinon
Si S1 > S2 Alors
"A < B"
Sinon
// On boucle pour comparer les bits 1 par 1 en partant de la gauche
// A>>(6-i) signifie qu'on va faire un décalage de 6 bits sur la gauche
// Puis on fait un masque avec un & 0x01 pour récupérer uniquement le bit qui nous intéresse

i = 0
TantQue (i < 7) ET ((A>>(6-i) & 0x01) == (B>>(6-i) & 0x01)) faire
i++
FinPour

// Une fois ici, on a plusieurs solutions :
// 1. On a parcouru tout les bits donc i vaut 7 alors A et B sont égaux
// 2. On n'a pas tout parcouru, et dans ce cas i est egal à l'index du bit qui différe dans les deux nombres

Si (i == 7) Alors
"A = B"
Sinon
Si ((A>>(6-i) & 0x01) < (B>>(6-i) & 0x01)) Alors
"A < B"
Sinon
"A > B"

Voilà j'ai peut être fait quelques erreurs mais le principe est bon à mon avis.
  • Partager sur Facebook
  • Partager sur Twitter
23 janvier 2010 à 0:29:39

Citation : djbad

Tableau A(7) , B(7) en numerique " 2 tableau contenant 8 chiffre


Si tu veux stocker 8 bits, pour tu déclares un tableau de 7 cases ?

# Compare a et b, deux nombres notés en complément à deux sur 8 bits.
# Paramètres :
#  A et B : tableau de 8 cases contenant des 0 ou des 1
# Résultat :
#  -1 si A < B
#  0 si A = B
#  1 si A > B
def comparaison(a, b):
    if (a == b): # A = B
        return 0
    elif (a[0] == 1 and b[0] == 0): # A < 0 et B > 0
        return -1
    elif (a[0] == 0 and b[0] == 1): # A > 0 et B < 0
        return 1
    else:
        for i in xrange(1, 8): # Pour i de 1 à 7
            if (a[i] > b[i]):
                return 1
            elif (a[i] < b[i]):
                return -1

Ce qui est bien en python, c'est que c'est "presque de l'algo"
Si tu comprends un minimun l'anglais, je pense que tu devrais t'en sortir
  • Partager sur Facebook
  • Partager sur Twitter
23 janvier 2010 à 15:14:55

merci ca m'aide beaucoup
mais une question ou peut etre que j'ai mal compris
quand le bit fort est egale à 0 nous somme dans le positif donc si A(3) = 1 et B(3) = 0 alors A>B
mais quand c'est négatif c'est l'inverse
quand le bit fort est egale à 1 nous somme dans le negatif donc si A(3) = 1 et B(3) = 0 alors A<B
donc je ne comprends pas la fin de vos algo

Citation

i = 0
TantQue (i < 7) ET ((A>>(6-i) & 0x01) == (B>>(6-i) & 0x01)) faire
i++
FinPour

// Une fois ici, on a plusieurs solutions :
// 1. On a parcouru tout les bits donc i vaut 7 alors A et B sont égaux
// 2. On n'a pas tout parcouru, et dans ce cas i est egal à l'index du bit qui différe dans les deux nombres
Si (i == 7) Alors
"A = B"
Sinon
Si ((A>>(6-i) & 0x01) < (B>>(6-i) & 0x01)) Alors
"A < B"
Sinon
"A > B"


et

Citation

else:
for i in xrange(1, 8): # Pour i de 1 à 7
if (a[i] > b[i]):
return 1
elif (a[i] < b[i]):
return -1



ou peut etre que j'ai mal compris
Merci quand meme pour vos aide
  • Partager sur Facebook
  • Partager sur Twitter
23 janvier 2010 à 16:04:46

def bit(n, i):
   return (n >> i) & 1

# Compare a et b, deux nombres notés en complément à deux sur 8 bits.
# Paramètres :
#  A et B : octets représentés par des entiers, en complément à deux
# Résultat :
#  négatif si A < B
#  égal à 0 si A = B
#  positif si A > B
def comparaison(a, b):
    a0, b0 = bit(a,8), bit(b, 8)
    if (a0 <> b0):
        return (1 if a0 == 0 else -1)
    for i in xrange(0,7):
        di = cmp(bit(a,i), bit(b,i))
        if (di <> 0):
            return di
    return 0


L'implémentation repose sur le fait que, si les nombres sont négatifs, en complément à deux celui qui contient un 0 est plus petit que celui qui contient un 1. On peut donc utiliser la comparaison classique, qu'ils soient positifs ou négatifs.
  • Partager sur Facebook
  • Partager sur Twitter
25 janvier 2010 à 21:06:33

merci ca m'aide beaucoup
malgré je ne comprend pas trop python
j'y vois un peu plus clair
merci pour vos aides
  • Partager sur Facebook
  • Partager sur Twitter
20 octobre 2022 à 16:50:25

Une approche directe consiste à parcourir toutes les sous-séquences. On calcule la somme des
éléments de chaque sous-séquence et on compare avec la somme maximale trouvée jusqu'à
maintenant. Autrement dit, pour chaque 1 ≤ l ≤ u ≤ n on calcule la somme :
                            xl...u = xl + ... + xu.
quelqu'un m'a aidée  s'il vous plait !! 

-
Edité par WassimaRaichy 20 octobre 2022 à 16:56:05

  • Partager sur Facebook
  • Partager sur Twitter
20 octobre 2022 à 17:52:38

créé ton propre sujet et donne un peu plus de détail parce que là on ne comprends rien.
  • Partager sur Facebook
  • Partager sur Twitter
20 octobre 2022 à 18:06:36

Il s'est passé quelque chose de spécial en 2010? On en est à notre deuxième déterrage ...
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

20 octobre 2022 à 18:06:58

@WassimaRaichy Bonsoir, merci de ne pas déterrer d'ancien sujet résolu. Créer le votre dans le respect des règles du forum à savoir qu'un message commence par des règles de politesses (un bonjour ou des salutations à la communauté et se termine par des remerciements par avance pour les futures réponses) un descriptif de votre problème et le code que vous avez écrit inséré sur le forum avec l'outil d'intégration de code soit le bouton code </>.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter