Batch Index du Forum
S’enregistrerRechercherFAQMembresGroupesConnexion
Répondre au sujet Page 1 sur 1
[R]Façon bizarre d'effectuer un calcul
Auteur Message
Répondre en citant
Message [R]Façon bizarre d'effectuer un calcul 
Bonsoir,
j'étais en train d'analyser un code et voilà que je tombe sur un calcul effectué bizarrement et encore plus bizarre je ne trouve pas ce qu'il fait en concret


Code:

set /a "dy <<= 1"
set /a "dy >>= 1"

set /a "dx>>1"
set /a "dx<<1"

REM Et

set /a "fraction=dy-(dx>>1)"


Je me demande bien ce que cela peut être... si quelqu'un a une idée...

Merci d'avance,



Dernière édition par programme le Dim 22 Juil 2018 - 09:15; édité 1 fois

______________________________________________________

Programme
Skype
Message Publicité 
PublicitéSupprimer les publicités ?


Répondre en citant
Message [R]Façon bizarre d'effectuer un calcul 
Toutes les réponses sont ici : https://gfx.developpez.com/tutoriel/java/binaire/

Donc faire :
Code:
set /a "dx <<= 1"

revient à faire :
Code:
set /a "dx *= 2"

mais c'est plus rapide


Petite démo :
Code:
@echo off

set a=10
set b=4

set /a "dx = a << 1"
set /a "dy = b >> 1"

echo;%a% ^<^< 1 = %dx%
echo;%b% ^>^> 1 = %dy%

echo;&echo;


set /a "dx = a * 2"
set /a "dy = b / 2"

echo;%a% * 2 = %dx%
echo;%b% / 2 = %dy%


pause>nul&exit





______________________________________________________
la vie est trop courte pour retirer le périphérique USB en toute sécurité...
Si la statue de la liberté lève le bras depuis 125 ans, c'est parce qu'elle cherche du réseau sur son Blackberry Torches...
Grâce à mon nouveau correcteur automatiste sur mon téléphage, je ne fais plus aucune faute d'orthodontie.
Quelqu'un a t il déjà demandé au drapeau japonais ce qu'il enregistre depuis tout ce temps ?
Visiter le site web du posteur
Répondre en citant
Message [R]Façon bizarre d'effectuer un calcul 
Flammrock a écrit:

Donc faire :
Code:
set /a "dx <<= 1"

revient à faire :
Code:
set /a "dx *= 2"

mais c'est plus rapide


En fait, c'est surtout pour faire des opérations au niveau du bit.
L'argument de rapidité n'a de sens qu'au niveau du cpu via du code
compilé, ce qui est très très loin d'être le cas dans cet exemple.



Répondre en citant
Message [R]Façon bizarre d'effectuer un calcul 
Flammrock a écrit:
Toutes les réponses sont ici : https://gfx.developpez.com/tutoriel/java/binaire/

Donc faire :
Code:
set /a "dx <<= 1"

revient à faire :
Code:
set /a "dx *= 2"

mais c'est plus rapide


Petite démo :
Code:
@echo off

set a=10
set b=4

set /a "dx = a << 1"
set /a "dy = b >> 1"

echo;%a% ^<^< 1 = %dx%
echo;%b% ^>^> 1 = %dy%

echo;&echo;


set /a "dx = a * 2"
set /a "dy = b / 2"

echo;%a% * 2 = %dx%
echo;%b% / 2 = %dy%


pause>nul&exit


Ok merci donc ça n'a pas de sens de changer le 1 par 2 par exemple ?




______________________________________________________

Programme
Skype
Répondre en citant
Message [R]Façon bizarre d'effectuer un calcul 
programme a écrit:
Ok merci donc ça n'a pas de sens de changer le 1 par 2 par exemple ?



Oui tu peux même mettre des lettres ou tout autre symbole c'est pareil ça n'a pas de signification, le 1 est juste la comme ça pour décorer histoire de faire jolie

Tu n'es pas aller le voir le lien que je t'ai passé ? ( Celui-là : https://gfx.developpez.com/tutoriel/java/binaire/ )

En gros, ça permet de faire un "décalage binaire" vers la droite ou vers la gauche.
Prenons l'exemple avec le nombre 4, il s'écrit en binaire comme ça : 100 (ça peut paraître peut-être compliqué à première vue mais c'est très simple)

Pour convertir un nombre qui est en base 10 en base 2, on peut faire un tableau comme ça :


...
32
16
 8
 4
 2
 1








Ensuite il suffit (à la même manière d'une division) de placer un 1 ou un 0 en face de chacun des nombres.
Par exemple si on prend le chiffre 5, on fais case par case,

    dans 5 combien de fois il y a 32 : 0
    dans 5 combien de fois il y a 16 : 0
    dans 5 combien de fois il y a 8 : 0
    dans 5 combien de fois il y a 4 : 1
      on soustrait donc 4 à 5 : 5-4 = 1

    dans 1 combien de fois il y a 2 : 0
    dans 1 combien de fois il y a 1 : 1



Ainsi le tableau devient :
...
32
16
 8
 4
 2
 1

 0
0
0
1
0
1


Donc 5(10) = 101(2)

Et bien sûr plus le nombre est grand plus il faut agrandir le tableau.
Ensuite que signifie ceci : 5 << 1 ?
Et bin il suffit de décaler de 1 chaque bit vers la gauche, ce qui donne avec 5 :

    5(10) << 1 = 1010(2) = 10(10)

(j'insiste sur le fait que les bits on était décalé, on a pas rajouté un 0 au bout comme ça)

Donc on peut s'amuser à décaler de 2 maintenant qu'on a compris un peu le concept :

    5(10) << 2 = 10100(2) = 20(10)


On peut voir que décaler les bits vers la gauche consiste à faire une multiplication par 2n
    Si on décalé de :
      1 on multiplie par 21
      2 on multiplie par 22


Et c'est le même principe dans l'autre sens lorsque qu'on décale vers la droite.
Je te conseil de faire des recherches si tu veux en savoir +, là j'ai juste expliqué en gros le concept.




______________________________________________________
la vie est trop courte pour retirer le périphérique USB en toute sécurité...
Si la statue de la liberté lève le bras depuis 125 ans, c'est parce qu'elle cherche du réseau sur son Blackberry Torches...
Grâce à mon nouveau correcteur automatiste sur mon téléphage, je ne fais plus aucune faute d'orthodontie.
Quelqu'un a t il déjà demandé au drapeau japonais ce qu'il enregistre depuis tout ce temps ?
Visiter le site web du posteur
Répondre en citant
Message [R]Façon bizarre d'effectuer un calcul 
Flammrock a écrit:
programme a écrit:
Ok merci donc ça n'a pas de sens de changer le 1 par 2 par exemple ?



Oui tu peux même mettre des lettres ou tout autre symbole c'est pareil ça n'a pas de signification, le 1 est juste la comme ça pour décorer histoire de faire jolie

Tu n'es pas aller le voir le lien que je t'ai passé ? ( Celui-là : https://gfx.developpez.com/tutoriel/java/binaire/ )

En gros, ça permet de faire un "décalage binaire" vers la droite ou vers la gauche.
Prenons l'exemple avec le nombre 4, il s'écrit en binaire comme ça : 100 (ça peut paraître peut-être compliqué à première vue mais c'est très simple)

Pour convertir un nombre qui est en base 10 en base 2, on peut faire un tableau comme ça :


...
32
16
 8
 4
 2
 1








Ensuite il suffit (à la même manière d'une division) de placer un 1 ou un 0 en face de chacun des nombres.
Par exemple si on prend le chiffre 5, on fais case par case,

    dans 5 combien de fois il y a 32 : 0
    dans 5 combien de fois il y a 16 : 0
    dans 5 combien de fois il y a 8 : 0
    dans 5 combien de fois il y a 4 : 1
      on soustrait donc 4 à 5 : 5-4 = 1

    dans 1 combien de fois il y a 2 : 0
    dans 1 combien de fois il y a 1 : 1



Ainsi le tableau devient :
...
32
16
 8
 4
 2
 1

 0
0
0
1
0
1


Donc 5(10) = 101(2)

Et bien sûr plus le nombre est grand plus il faut agrandir le tableau.
Ensuite que signifie ceci : 5 << 1 ?
Et bin il suffit de décaler de 1 chaque bit vers la gauche, ce qui donne avec 5 :

    5(10) << 1 = 1010(2) = 10(10)

(j'insiste sur le fait que les bits on était décalé, on a pas rajouté un 0 au bout comme ça)

Donc on peut s'amuser à décaler de 2 maintenant qu'on a compris un peu le concept :

    5(10) << 2 = 10100(2) = 20(10)


On peut voir que décaler les bits vers la gauche consiste à faire une multiplication par 2n
    Si on décalé de :
      1 on multiplie par 21
      2 on multiplie par 22


Et c'est le même principe dans l'autre sens lorsque qu'on décale vers la droite.
Je te conseil de faire des recherches si tu veux en savoir +, là j'ai juste expliqué en gros le concept.



Si j'ai été voir mais cela n'était pas aussi clair que ceci (j'avais jamais vu cela comme ca) . J'avais trouvé la corrélation 2x du nombre mais j'avais écarté l'affaire étant donné que dans set /a "hello>>1", le nombre 2 n'apparîssait nulle part.


Merci de ton aide !




______________________________________________________

Programme
Skype
Message [R]Façon bizarre d'effectuer un calcul 


Montrer les messages depuis:
Répondre au sujet Page 1 sur 1
  



Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Copyright 2008 - 2016 // Batch