IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Décalage de bit vers la droite ">>>" (signe décalé) [WD15]


Sujet :

WinDev

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 58
    Points : 33
    Points
    33
    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 éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 200
    Points : 9 187
    Points
    9 187
    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 appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 58
    Points : 33
    Points
    33
    Par défaut
    si, le input c'est entier

    Voici un simple bout en Java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 200
    Points : 9 187
    Points
    9 187
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    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 éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 200
    Points : 9 187
    Points
    9 187
    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 appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 58
    Points : 33
    Points
    33
    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 émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    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
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 58
    Points : 33
    Points
    33
    Par défaut
    Le but c'est de transformer une trame binaire vers décimal


    voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. Comment faire une rotation des bits vers la droite ?
    Par Jean-Marc.Bourguet dans le forum Télécharger
    Réponses: 0
    Dernier message: 30/11/2010, 17h12
  2. Image décalage vers la droite incontrôlable
    Par betsprite dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 10
    Dernier message: 27/11/2010, 12h24
  3. Décalage vers la droite sous IE
    Par baggie dans le forum Mise en page CSS
    Réponses: 13
    Dernier message: 23/12/2009, 10h57
  4. Problème de DIV et CSS, décalage vers la droite et en haut
    Par alexis1975 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 06/05/2009, 18h58
  5. [WD] Décallage d'un bit vers la droite
    Par Amanck dans le forum WinDev
    Réponses: 1
    Dernier message: 27/08/2008, 11h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo