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
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
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
si, le input c'est entier
Voici un simple bout en Java :
en réalité c'est une boucle donc y peut avoir d'autres valeurs
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;
merci
Pas sûr que le partieentière soit nécessaire, mais pas le temps de tester...
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)
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
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.
Bonne journéeLes 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.
Hemgé
+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
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.
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é.
Le but c'est de transformer une trame binaire vers décimal
voici le code
A+
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
Bonsoir et merci.
trois suggestions :
- Lorsque vous n'extrayez qu'un caractère, pas besoin de spécifier une plage :
cBin[[i A i]] peut s'écrire cBin[[i]].- 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.- SI / ALORS peut être écrit sur une ligne, mais c'est une question d'habitude personnelle.
Tout ceci donnerait :
Bon weekend.
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
Hemgé
[EDIT] retrait d'une suggestion erronée d'adaptation du code
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 :
En conclusion, l'équivalent de >>> en Java, c'est bitDécaleDroite sur un entier sans signe.
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"))
PS2. Il y a une erreur dans la doc de WinDev :
C'est faux évidemment, car sinon ça serait une rotation et non un décalage.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.
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager