Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > WinDev
WinDev Forum d'entraide sur la programmation en WinDev
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/01/2013, 16h27   #1
TANITE
Invité de passage
 
Homme
Inscription : juin 2012
Messages : 33
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2012
Messages : 33
Points : 1
Points : 1
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
TANITE est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 09/01/2013, 16h55   #2
frenchsting
Expert Confirmé
 
Avatar de frenchsting
 
Homme Claude
Développeur informatique
Inscription : juin 2003
Messages : 1 806
Détails du profil
Informations personnelles :
Nom : Homme Claude
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juin 2003
Messages : 1 806
Points : 3 151
Points : 3 151
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
frenchsting est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 21h19   #3
TANITE
Invité de passage
 
Homme
Inscription : juin 2012
Messages : 33
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2012
Messages : 33
Points : 1
Points : 1
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
TANITE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 08h12   #4
frenchsting
Expert Confirmé
 
Avatar de frenchsting
 
Homme Claude
Développeur informatique
Inscription : juin 2003
Messages : 1 806
Détails du profil
Informations personnelles :
Nom : Homme Claude
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juin 2003
Messages : 1 806
Points : 3 151
Points : 3 151
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
frenchsting est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 08h47   #5
Hemgé
Membre chevronné
 
Homme
Inscription : octobre 2007
Messages : 308
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2007
Messages : 308
Points : 730
Points : 730
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.

Citation:
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é
Hemgé est déconnecté   Envoyer un message privé Réponse avec citation 21
Vieux 10/01/2013, 09h43   #6
frenchsting
Expert Confirmé
 
Avatar de frenchsting
 
Homme Claude
Développeur informatique
Inscription : juin 2003
Messages : 1 806
Détails du profil
Informations personnelles :
Nom : Homme Claude
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juin 2003
Messages : 1 806
Points : 3 151
Points : 3 151
+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
frenchsting est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 08h55   #7
TANITE
Invité de passage
 
Homme
Inscription : juin 2012
Messages : 33
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2012
Messages : 33
Points : 1
Points : 1
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.

TANITE est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 11/01/2013, 10h03   #8
Hemgé
Membre chevronné
 
Homme
Inscription : octobre 2007
Messages : 308
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2007
Messages : 308
Points : 730
Points : 730
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é.
Hemgé est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 11/01/2013, 15h36   #9
TANITE
Invité de passage
 
Homme
Inscription : juin 2012
Messages : 33
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2012
Messages : 33
Points : 1
Points : 1
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+
TANITE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 22h44   #10
Hemgé
Membre chevronné
 
Homme
Inscription : octobre 2007
Messages : 308
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2007
Messages : 308
Points : 730
Points : 730
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
Hemgé est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/01/2013, 10h28   #11
Hibernatus34
Membre émérite
 
Inscription : août 2010
Messages : 529
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 529
Points : 992
Points : 992
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 :
Citation:
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.
Hibernatus34 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h16.


 
 
 
 
Partenaires

Hébergement Web