+ Répondre à la discussion
Affichage des résultats 1 à 11 sur 11
  1. #1
    Invité de passage
    Homme Profil pro
    Inscrit en
    juin 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juin 2012
    Messages : 49
    Points : 3
    Points
    3

    Par défaut Décalage de bit vers la droite ">>>" (signe décalé)

    Bonjour,

    Je cherche équivalent Windev de la fonction Java ">>>" (Décalage de bit vers la droite avec signe décalé)

    Il me semble que la fonction WD bitDécaleGauche ne suffit pas.

    Merci

  2. #2
    Expert Confirmé
    Avatar de frenchsting
    Homme Profil pro Claude
    Développeur informatique
    Inscrit en
    juin 2003
    Messages
    1 956
    Détails du profil
    Informations personnelles :
    Nom : Homme Claude
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2003
    Messages : 1 956
    Points : 3 287
    Points
    3 287

    Par défaut

    C'est quoi que tu as en entrée ? Un entier ?
    Si tu fais une division entière par 2, ça ne marche pas ?
    Commencez toujours par là : et puis n'hésitez à passer par là : ou par un autre moteur de recherche...
    Pas de question par MP s'il vous plait. Le forum est fait pour cela...

    Make it real not fantasy

  3. #3
    Invité de passage
    Homme Profil pro
    Inscrit en
    juin 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juin 2012
    Messages : 49
    Points : 3
    Points
    3

    Par défaut

    si, le input c'est entier

    Voici un simple bout en Java :

    Code :
    1
    2
    3
    4
    5
    6
    int  y, Bitshift;
    
    Bitshift = 2;
    
    y = 10;
    y = y >>> Bitshift;
    en réalité c'est une boucle donc y peut avoir d'autres valeurs

    merci

  4. #4
    Expert Confirmé
    Avatar de frenchsting
    Homme Profil pro Claude
    Développeur informatique
    Inscrit en
    juin 2003
    Messages
    1 956
    Détails du profil
    Informations personnelles :
    Nom : Homme Claude
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2003
    Messages : 1 956
    Points : 3 287
    Points
    3 287

    Par défaut

    Code :
    1
    2
    3
    4
    y, Bitshift sont des entiers
    Bitshift = 2
    y = 10
    y = PartieEntière(y/Bitshift)
    Pas sûr que le partieentière soit nécessaire, mais pas le temps de tester...
    Commencez toujours par là : et puis n'hésitez à passer par là : ou par un autre moteur de recherche...
    Pas de question par MP s'il vous plait. Le forum est fait pour cela...

    Make it real not fantasy

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    octobre 2007
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2007
    Messages : 605
    Points : 1 416
    Points
    1 416

    Par défaut

    Bonjour

    Avez-vous consulté l'aide ?
    Vraisemblablement pas ...

    Mot clé : 'binaire', puis dans la liste : 'opérateurs binaires'

    Vous aboutissez ici et devriez y trouver la réponse cherchée.

    Les opérations sur des valeurs binaires sont réalisées :

    avec des fonctions du WLangage : ETBinaire, OUBinaire, NONBinaire, OUExclusifBinaire
    avec des opérateurs spécifiques : opérateurs binaires, opérateurs de décalage vers la droite et vers la gauche, opérateur d'accès aux bits.
    Bonne journée

    Hemgé

  6. #6
    Expert Confirmé
    Avatar de frenchsting
    Homme Profil pro Claude
    Développeur informatique
    Inscrit en
    juin 2003
    Messages
    1 956
    Détails du profil
    Informations personnelles :
    Nom : Homme Claude
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2003
    Messages : 1 956
    Points : 3 287
    Points
    3 287

    Par défaut

    +1 Hemgé.

    Effectivement, ils existent en windev depuis la version 14.

    Ma méthode doit normalement fonctionner (je suis en 12).
    Commencez toujours par là : et puis n'hésitez à passer par là : ou par un autre moteur de recherche...
    Pas de question par MP s'il vous plait. Le forum est fait pour cela...

    Make it real not fantasy

  7. #7
    Invité de passage
    Homme Profil pro
    Inscrit en
    juin 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juin 2012
    Messages : 49
    Points : 3
    Points
    3

    Par défaut

    En fait, j'ai bien consulté l'aide :

    copier / coller de mon première message

    Il me semble que la fonction WD bitDécaleGauche ne suffit pas.

    mais c'est pas grave, mon problème est résolu sans utilisation des fonction de décalage

    Merci quand même et bonne journée.


  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    octobre 2007
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2007
    Messages : 605
    Points : 1 416
    Points
    1 416

    Par défaut

    Bonjour,

    Désolé, j'ai été trop rapide.

    Pourriez-vous, à titre de participation au Forum, au moins exposer votre solution pour élargir la "base de connaissance" du Forum ?
    Elle sera utile en général et en particulier pour ceux qui utilisent des versions où ces fonctions ne sont pas encore implémentées.

    Vous nous sollicitez et nous vous aidons quand nous le pouvons.
    Vous avez soulevé un problème que d'autres risquent de rencontrer.
    Il me semble normal que vous partagiez votre solution avec la communauté.
    J'espère que vous partagerez ce point de vue.

    Bonne journée

    Hemgé.

  9. #9
    Invité de passage
    Homme Profil pro
    Inscrit en
    juin 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juin 2012
    Messages : 49
    Points : 3
    Points
    3

    Par défaut

    Le but c'est de transformer une trame binaire vers décimal


    voici le code

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    FUNCTION GLOBALE BinaireVersChaine (CHAINEBINAIRE)
    cBin est une chaîne = CHAINEBINAIRE
    i est un entier
    j est un entier
    eDecimal est un entier
    eTemp est un entier
    
    POUR i = Taille (cBin) A 1 PAS -1
    	eTemp = 2*Val (cBin[[i A i]])
    	SI eTemp ALORS
    		eDecimal += Puissance (eTemp,j)
    	FIN
    	j++
    FIN
    
    RENVOYER eDecimal
    A+

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    octobre 2007
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2007
    Messages : 605
    Points : 1 416
    Points
    1 416

    Par défaut

    Bonsoir et merci.

    trois suggestions :
    1. Lorsque vous n'extrayez qu'un caractère, pas besoin de spécifier une plage :
      cBin[[i A i]] peut s'écrire cBin[[i]].
    2. Dans une boucle POUR :
      Bien que personnellement, je préfère la déclarer pour que tout soit clair, la variable de contrôle ( i ) ne doit pas nécessairement être déclarée.

      Mais surtout, si les valeurs initiale et/ou finale sont des expressions, elles sont évaluées à chaque itération, ce qui ralentit votre programme (si le nombre d'itérations est important) et surtout elles pourraient être modifiées par mégarde en cours de boucle.
      Il est donc préférable de les évaluer avant d'entrer dans la boucle et d'affecter leur valeur à une variable de travail.
    3. SI / ALORS peut être écrit sur une ligne, mais c'est une question d'habitude personnelle.



    Tout ceci donnerait :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    FUNCTION GLOBALE BinaireVersChaine (CHAINEBINAIRE)
    cBin est une chaîne = CHAINEBINAIRE
    i est un entier   //pas indispensable
    j est un entier   
    eDecimal est un entier
    eTemp est un entier
    valInitiale est un entier = Taille(cBin)
    
    
    POUR i = valInitiale A 1 PAS -1
    	eTemp = 2*Val (cBin[[i]])
    	SI eTemp ALORS eDecimal += Puissance (eTemp,j)
    	j++ 
    FIN
    
    RENVOYER eDecimal
    Bon weekend.

    Hemgé

    [EDIT] retrait d'une suggestion erronée d'adaptation du code

  11. #11
    Membre Expert
    Inscrit en
    août 2010
    Messages
    657
    Détails du profil
    Informations forums :
    Inscription : août 2010
    Messages : 657
    Points : 1 439
    Points
    1 439

    Par défaut

    C'est un peu tard pour répondre mais c'est intéressant.
    Java n'a pas les types non-signés, c'est pour ça qu'ils ont besoin d'opérateurs différents selon que l'on propage le bit de signe ou pas.
    En WD on a les types non-signés, donc logiquement ça devrait faire comme en C++, propager le signe uniquement quand l'opérande de gauche est signée.
    A tester.
    (et je sais pas pourquoi vous parlez de bitDécaleGauche à la place de bitDécaleDroite)

    PS.
    Je confirme, WinDev fait les décalages comme il faut :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    n1 est entier sur 1 = -2
    u1 est entier sans signe sur 1 = 0xFE
    n2 est entier sur 2 = -2
    u2 est entier sans signe sur 2 = 0xFFFE
    n4 est entier sur 4 = -2
    u4 est entier sans signe sur 4 = 0xFFFFFFFE
    
    Trace(NumériqueVersChaîne(n1, "2X"), " -> ", NumériqueVersChaîne(bitDécaleDroite(n1, 1), "2X"))
    Trace(NumériqueVersChaîne(u1, "2X"), " -> ", NumériqueVersChaîne(bitDécaleDroite(u1, 1), "2X"))
    Trace(NumériqueVersChaîne(n2, "4X"), " -> ", NumériqueVersChaîne(bitDécaleDroite(n2, 1), "4X"))
    Trace(NumériqueVersChaîne(u2, "4X"), " -> ", NumériqueVersChaîne(bitDécaleDroite(u2, 1), "4X"))
    Trace(NumériqueVersChaîne(n4, "8X"), " -> ", NumériqueVersChaîne(bitDécaleDroite(n4, 1), "8X"))
    Trace(NumériqueVersChaîne(u4, "8X"), " -> ", NumériqueVersChaîne(bitDécaleDroite(u4, 1), "8X"))
    En conclusion, l'équivalent de >>> en Java, c'est bitDécaleDroite sur un entier sans signe.

    PS2. Il y a une erreur dans la doc de WinDev :
    En Java et en Android, l'opérateur de décalage binaire à gauche réinjectera par la droite les bits qui dépassent la taille de l'opérande. L'opérateur de décalage binaire à droite réinjectera par la gauche les bits qui dépassent la taille de l'opérande.
    C'est faux évidemment, car sinon ça serait une rotation et non un décalage.
    En réalité, Java a un fonctionnement un peu particulier : il permet l'overflow sur l'opérande de droite. Ainsi, un ">>> 34" sur un int 32 bits équivaut à ">>> 2", car 34 modulo 32 = 2.
    Rien à voir avec l'explication donnée dans la doc de WinDev. Et PC Soft aurait pu facilement rendre le fonctionnement identique sur toutes les cibles.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •