VBA : Compréhension d'une méthode And 1

Kiseki

XLDnaute Occasionnel
Re : VBA : Compréhension d'une méthode And 1

Bonjour Pierrot93,

Le résultat renvoi 1 si NB est impair et 0 s'il est pair, c'est plus rapide que d'utiliser le modulo.

Donc j’aurai aimer comprendre cette logique, pour éventuellement m'en servir de différentes manières.
 

Kiseki

XLDnaute Occasionnel
Re : VBA : Compréhension d'une méthode And 1

Je pense avoir trouvée :

Notre nouvelle fonction IsNumberEven est certes plus performante que la première, mais est-elle pour autant la meilleure ? Hélas, la réponse est non. Il est en effet plus rapide encore de tirer parti de la propriété mathématique suivante : « tout nombre pair écrit en binaire se termine par un zéro ». C'est simple : 2 s'écrit 10, 4 s'écrit 100, 6 s'écrit 110, etc... (et cela se généralise). Allons-y donc franchement et savourons notre victoire (même dérisoire, une victoire est toujours une victoire) :

'Détermine si un nombre est impair

Public Function
IsNumberEven (Number As Long) As Boolean

IsNumberEven = ((Number
And 1) = 0)

End Function

Mais de là à saisir comment ce servir de ce genre de comparaison ^^.
 

Pierrot93

XLDnaute Barbatruc
Re : VBA : Compréhension d'une méthode And 1

Re,

regarde également ce que l'on peut lire dans l'aidfe vba à propos de l'opérateur "And"..

L'opérateur And permet également d'effectuer une comparaison au niveau du bit des bits occupant la même position dans deux expressions numériques et définit le bit correspondant dans l'argument result selon le tableau ci-dessous :

Bit dans expression1 Bit dans expression2 Argument result
0 0 0
0 1 0
1 0 0
1 1 1
 

Misange

XLDnaute Barbatruc
Re : VBA : Compréhension d'une méthode And 1

Bonjour à tous

Futé. Mais un peu abscons il faut bien le dire.
Une jolie page en anglais ou McGimpsey a compilé des astuces d'Harlan Grove
McGimpsey & Associates : Excel : Bitwise Logical Operations

cela dit utiliser le modulo est quand même plus simple à comprendre (et à retenir)
Certains disent que utiliser nombre and 1 est bien plus rapide...
C'était peut être vrai il y a quelques années mais en tous cas sur mon PC c'est vraiment du kif :

Code:
Sub test1()
    Dim i As Long, n As Long, res As Boolean
    n = Timer
    For i = 0 To 1000000000
        res = (i And 1) = 0
    Next
    MsgBox Timer - n
End Sub
Sub test2()
    Dim i As Long, n As Long, res As Boolean
    n = Timer
    For i = 0 To 1000000000
       res = (i Mod 2) = 0
    Next
    MsgBox Timer - n
End Sub
 

Kiseki

XLDnaute Occasionnel
Re : VBA : Compréhension d'une méthode And 1

Bonjour Misange,

Je n'arrive pas au même résultat après chaque utilisation.

Sinon il suffit de faire :
not (i And 1)

Pour inverser, ce qui enlève la comparaison à 0, tu à tenter ce genre de variante aussi ?
 

Misange

XLDnaute Barbatruc
Re : VBA : Compréhension d'une méthode And 1

Salut Kiseki,
oui pour tester il faut faire le test au moins une dizaine de fois et faire la moyenne des valeurs obtenues. C'est une histoire de mémoire mais j'ai oublié l'explication complète.
l'idée dans les deux bouts de macro c'était de faire les codes les plus proches possibles pour comparer leur rapidité. Je n'ai pas testé not(i and 1) mais je serai surprise que ce soit beaucoup plusr apide !
En tous cas j'ai lu de ci de là que i and 1 est beaucoup plus rapide que i mod 2... Je suis plus que sceptique sur ce point et en général je déteste les codes qui "font chic", qui sont incompréhensibles aux communs des programmeurs. En gros les informaticiens parlent aux informaticiens c'est pas trop mon truc, surtout quand il y a une autre façon de faire tout aussi efficace (évidemment, il y a des cas ou l'optimisation est vraiment nécessaire)
 

Kiseki

XLDnaute Occasionnel
Re : VBA : Compréhension d'une méthode And 1

Ok, merci,

Oui, je pense que c'est plus rapide dans le sens où c'est plus proche de la machine et que le modulo doit encore calculer.

Je comprend parfaitement ce que tu pense, d'un point de vue compréhension ça aide beaucoup, mais j'aime quand même être performant et cherche à prendre de bonnes habitudes, une fois compris que "ça" vérifie si c'est pair ou non, aucun besoin de savoir le comprendre, on sait dès lors utiliser une méthode plus performante.

Du moindre du point de vue d'une personne à l'aise (pas forcément un expert) apprendre une chose en plus ce n'est pas grand chose, tandis qu'une personne qui n'est pas encore à l'aise ce n'est pas terrible de rajouter encore quelque chose.

C'est surtout intéressant de savoir que ça existe afin d'accélérer une longue procédure, je l'admets, entre optimiser et une procédure habituel la différence de temps d'exécution n'est sans doute pas importante.
 
Dernière édition:

Statistiques des forums

Discussions
312 651
Messages
2 090 529
Membres
104 565
dernier inscrit
boltonredax