OVH Cloud OVH Cloud

Opérateur Logique ?

15 réponses
Avatar
Driss HANIB
Bonjour à tous,

Pour des raisons de commodité sur un document apparaissent plusieurs
'personnes' en en tête.
Les personnes présentes en entête peuvent varier d'un document à l'autre. Et
je dois garder ces personnes pour réimprimer le document si besoin.

Les données sont stockées dans une base Access
Chaque personne est identifiée par un numéro interne 'auto incrémenté' donc
unique.
Dans l'enregistrement définissant le document j'ai mis un champ de type
entier long qui aura un nombre ('donc !) qui est la somme des puisssance de
2 avec comme indice les numéro interne des personnes présentes :

il est de la forme N = 2^1 + 2^3 + 2^4 + 2^n..

Ce nombre est donc utilisable pour récupérer d'après ce je comprends par les
opérateurs logiques les différents numeros internes utilisés.

Seulement n'ayant pas étudié de manière correcte l'utilisation des
opérateurs, quelqu'un peut il m'aider pour vérifier la présence ou non d'un
numéro interne

partons en prenant comme exemple

S = somme
N = num interne..

merci

Driss

10 réponses

1 2
Avatar
Fred
dans : news:u2US48$,
Driss HANIB écrivait :

Bonjour à tous,



Bonjour !

Chaque personne est identifiée par un numéro interne 'auto
incrémenté' donc unique.
Dans l'enregistrement définissant le document j'ai mis un champ de
type entier long qui aura un nombre ('donc !) qui est la somme des
puisssance de 2 avec comme indice les numéro interne des personnes
présentes :



partons en prenant comme exemple

S = somme
N = num interne..



if((S And 2^N)<>0) Then présente!

Tu es sûr que tu ne vas pas être rapidement limité avec un tel système ?
Maxi 31 personnes (avec 32, je soupçonne des problèmes de débordement de
capacité)


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
jean-marc
"Driss HANIB" a écrit dans le message de
news:u2US48$
Bonjour à tous,

Pour des raisons de commodité sur un document apparaissent plusieurs
'personnes' en en tête.
Les personnes présentes en entête peuvent varier d'un document à


l'autre. Et
je dois garder ces personnes pour réimprimer le document si besoin.

Les données sont stockées dans une base Access
Chaque personne est identifiée par un numéro interne 'auto incrémenté'


donc
unique.
Dans l'enregistrement définissant le document j'ai mis un champ de


type
entier long qui aura un nombre ('donc !) qui est la somme des


puisssance de
2 avec comme indice les numéro interne des personnes présentes :

il est de la forme N = 2^1 + 2^3 + 2^4 + 2^n..

Ce nombre est donc utilisable pour récupérer d'après ce je comprends


par les
opérateurs logiques les différents numeros internes utilisés.

Seulement n'ayant pas étudié de manière correcte l'utilisation des
opérateurs, quelqu'un peut il m'aider pour vérifier la présence ou non


d'un
numéro interne

partons en prenant comme exemple

S = somme
N = num interne..



Hello,

Je réponds en double avec Fred, j'avais déjà presque fini :-)

Je ne discuterais pas de la méthode, qui amha n'est pas géniale dans ce
contexte précis (voir le post de Fred).

En revanche, je peux expliquer comment utiliser les opérateurs bitwise
et
en particulier le AND qui est celui qui nous intéresse ici.

L'idée est que un AND fonctionne comme un masque.

soit le nombre binaire: 00101001

les bits sont numérotés de droite à gauche (<-), de 0 à 7.

SI on veut savoir si le bit 3 (le quatième en partant de la gauche)
est à 1, on fabrique le masque: "00001000", c'est à dire tous les bits
à 0 sauf celui que l'on veut tester.
On fait ensuite un AND entre le nombre et le masque:

00101001 AND 000010000

Le résultat est 000010000, ce qui nous indique que le bit que l'on
cherchait à tester est bien à 1.

Plus généralement:

Tester le bit n dans un nombre revient à faire:

r = n AND (2^n)

Si r = 0, le bit n'est pas mis, sinon il l'est (et dans ce cas r vaut
2^n).

soit le nombre

S = 4233 = 2^12 + 2^7 + 2^3 + 2^0 = 4096 + 128 + 8 + 1

on a:
S And 2^12 = 2^12
S And 2^7 = 2^7
S And 2^3 = 2^3
S And 2^0 = 2^0

Et pour toutes les autres valeurs de N, s And 2^N = 0

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Driss HANIB
merci je vais tester

en fait le nombre ne va pas varier beaucoup dans le temps, puisque ce sont
des membres du personnel. et qu'il y en a 7 ou 8 en permanence.
le numéro le plus fort actuellement est 9 et il n'y aura pas beaucoup de
modification d'ici de nombreuses années :o))

mais tu as raison
je resterai vigilant.
je souhaite pour l'instant utiliser le moins de place
j'avais pensé égalmenent à créer un chaine de caractères avec les numéros et
un séparateur en 'jouant' avec Join et Split
mais pour l'instant, à moins d'avoir d'autres possibilités, je pense rester
dans cette voie.
Si tu as néanmoins des suggestions..

en tout cas ..merci pour la rapidité de ta réponse

Driss
"Fred" a écrit dans le message de
news:
dans : news:u2US48$,
Driss HANIB écrivait :

> Bonjour à tous,

Bonjour !

> Chaque personne est identifiée par un numéro interne 'auto
> incrémenté' donc unique.
> Dans l'enregistrement définissant le document j'ai mis un champ de
> type entier long qui aura un nombre ('donc !) qui est la somme des
> puisssance de 2 avec comme indice les numéro interne des personnes
> présentes :

> partons en prenant comme exemple
>
> S = somme
> N = num interne..

if((S And 2^N)<>0) Then présente!

Tu es sûr que tu ne vas pas être rapidement limité avec un tel système ?
Maxi 31 personnes (avec 32, je soupçonne des problèmes de débordement de
capacité)


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT



Avatar
Picalausa François
Hello,

Avec cette technique, il faut faire attention aux dépassements de capacités
qui surviennent très vite
(ln(Max Variable)/ln(2) entrées au maximum - où ln est le log népérien; log
sous VB - ce qui revient à log en base 2...)

Ensuite, il suffit de tester à coup de And et d'ajouter à coup de Or:
(2^4 Or 2^7)
Correspond au utilisateurs 4 et 7

On voit celà par représentation binaire (utiliser une police à pas fixe):
00001000
Or 00000001
------------
00001001


A noter que les indices commencent à 0 et non à 1 (2^0 = 1, 2^1 = 2)
De même:
(2^4 Or 2^7 Or 2^1 Or 2^5)
Correspond au utilisateurs 1, 4, 5, 7

On effectue alors les comparaisons avec And:
If (((2^4 Or 2^7) And (2^5)) = 2^5) Then
Correspond à "l'utilisteur 5 est-il contenu dans la liste d'utilisateurs 4,
7".

En fonction des langages, puisque false =0 et true = différent de 0 on
abrège parfois ce test:
If ((2^4 Or 2^7) And (2^5)) Then

La représentation est la suivante:
00001001
And 00000100
-------------
00000000

Pour 4 And 4,7:
If (((2^4 Or 2^7) And (2^4)) = 2^4) Then
00001001
And 00001000
-------------
00001000

Pour vérifier quellques entrées sont présentes dans la liste, on peut
employer les puissances de deux calculées à la suite:
Exp2 = 1

'MAX-1 pour éviter le dépassement de capacité sur Exp2
For i = 1 to MAX-1
If Champ And Exp2 Then
Debug.Print i; 'Affiche le numéro d'utilisateur
End If
Exp2 = Exp2 * 2
Next i

If Champ And Exp2 Then
Debug.Print i;
End If

--
Picalausa François

"Driss HANIB" a écrit dans le message de news:
u2US48$
Dans l'enregistrement définissant le document j'ai mis un champ de type
entier long qui aura un nombre ('donc !) qui est la somme des puisssance
de
2 avec comme indice les numéro interne des personnes présentes :

il est de la forme N = 2^1 + 2^3 + 2^4 + 2^n..

Ce nombre est donc utilisable pour récupérer d'après ce je comprends par
les
opérateurs logiques les différents numeros internes utilisés.


Avatar
Driss HANIB
merci jean marc pour toutes ces explications que je vais étudier de très
près..

vois par rapport à ma réponse à Fred pour l'utilité.
Mais si tu as une autre méthode plus 'robuste' et 'éternelle' je suis
preneur

Driss


"jean-marc" a écrit dans le message de
news:44c64130$0$32418$
"Driss HANIB" a écrit dans le message de
news:u2US48$
> Bonjour à tous,
>
> Pour des raisons de commodité sur un document apparaissent plusieurs
> 'personnes' en en tête.
> Les personnes présentes en entête peuvent varier d'un document à
l'autre. Et
> je dois garder ces personnes pour réimprimer le document si besoin.
>
> Les données sont stockées dans une base Access
> Chaque personne est identifiée par un numéro interne 'auto incrémenté'
donc
> unique.
> Dans l'enregistrement définissant le document j'ai mis un champ de
type
> entier long qui aura un nombre ('donc !) qui est la somme des
puisssance de
> 2 avec comme indice les numéro interne des personnes présentes :
>
> il est de la forme N = 2^1 + 2^3 + 2^4 + 2^n..
>
> Ce nombre est donc utilisable pour récupérer d'après ce je comprends
par les
> opérateurs logiques les différents numeros internes utilisés.
>
> Seulement n'ayant pas étudié de manière correcte l'utilisation des
> opérateurs, quelqu'un peut il m'aider pour vérifier la présence ou non
d'un
> numéro interne
>
> partons en prenant comme exemple
>
> S = somme
> N = num interne..

Hello,

Je réponds en double avec Fred, j'avais déjà presque fini :-)

Je ne discuterais pas de la méthode, qui amha n'est pas géniale dans ce
contexte précis (voir le post de Fred).

En revanche, je peux expliquer comment utiliser les opérateurs bitwise
et
en particulier le AND qui est celui qui nous intéresse ici.

L'idée est que un AND fonctionne comme un masque.

soit le nombre binaire: 00101001

les bits sont numérotés de droite à gauche (<-), de 0 à 7.

SI on veut savoir si le bit 3 (le quatième en partant de la gauche)
est à 1, on fabrique le masque: "00001000", c'est à dire tous les bits
à 0 sauf celui que l'on veut tester.
On fait ensuite un AND entre le nombre et le masque:

00101001 AND 000010000

Le résultat est 000010000, ce qui nous indique que le bit que l'on
cherchait à tester est bien à 1.

Plus généralement:

Tester le bit n dans un nombre revient à faire:

r = n AND (2^n)

Si r = 0, le bit n'est pas mis, sinon il l'est (et dans ce cas r vaut
2^n).

soit le nombre

S = 4233 = 2^12 + 2^7 + 2^3 + 2^0 = 4096 + 128 + 8 + 1

on a:
S And 2^12 = 2^12
S And 2^7 = 2^7
S And 2^3 = 2^3
S And 2^0 = 2^0

Et pour toutes les autres valeurs de N, s And 2^N = 0

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;



Avatar
Driss HANIB
j'ai essayé ta réponse : c'est bon pour cette méthode

Driss


"Fred" a écrit dans le message de
news:
dans : news:u2US48$,
Driss HANIB écrivait :

> Bonjour à tous,

Bonjour !

> Chaque personne est identifiée par un numéro interne 'auto
> incrémenté' donc unique.
> Dans l'enregistrement définissant le document j'ai mis un champ de
> type entier long qui aura un nombre ('donc !) qui est la somme des
> puisssance de 2 avec comme indice les numéro interne des personnes
> présentes :

> partons en prenant comme exemple
>
> S = somme
> N = num interne..

if((S And 2^N)<>0) Then présente!

Tu es sûr que tu ne vas pas être rapidement limité avec un tel système ?
Maxi 31 personnes (avec 32, je soupçonne des problèmes de débordement de
capacité)


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT



Avatar
Fred
dans : news:,
Driss HANIB écrivait :

je souhaite pour l'instant utiliser le moins de place



Ta base est sur une disquette ? ;-)

j'avais pensé égalmenent à créer un chaine de caractères avec les
numéros et un séparateur en 'jouant' avec Join et Split



Oui, j'aurais pensé à cela également, j'aime bien quand c'est lisible.
Une solution purement base de données serait d'établir une table
supplémentaire de liens. Mais est-ce utile ? Toi seul le sais !

--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
Fred
dans : news:44c64130$0$32418$,
jean-marc écrivait :


Hello,



Hello,

Je réponds en double avec Fred, j'avais déjà presque fini :-)



Je savais que tu étais dans le coin : j'ai fait court ;-)
Bravo pour l'exposé !

--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
jean-marc
"Driss HANIB" a écrit dans le message de
news:%
merci jean marc pour toutes ces explications que je vais étudier de


très
près..

vois par rapport à ma réponse à Fred pour l'utilité.
Mais si tu as une autre méthode plus 'robuste' et 'éternelle' je suis
preneur



Et bien considérant ce que tu as dit (pas plus de 8 ou 10 personnes),
la méthode que tu te proposes d'employer me semble suffisante
et pérenne.

Inconvénients: une somme de puissance de 2 est peu lisible par un
humain "de base"; les programmeurs sont à part, c'est vrai :o)
Peu évolutif évidemment.
Avantages: compact, efficace, aisé à modifier (un simple AND avec le bon
bit à 0). A noter: certaines DB (DB2 pour ne pas le nommer) n'ont pas
de fonctions pour manipuler simplement les bits (pas de AND et OR
bitwise).

Plus robuste:
une table supplémentaire, comme suggéré par Fred, avec juste
ID_Document + ID_Personne, mais c'est peut être inutile dans
ton cas. Gros avantage: tu peux alors tout faire en pur SQL
standard, mais ce n'est à priori pas le but ici.

Plus lisible, plus évolutif:
Comme tu proposais, une chaine de caractères et les ID séparés
par une virgule: Pas mal, car facile à lire par un humain,
aisé à modifier manuellement si nécessaire, etc...

Au final, tu peux choisir! En réalité, si ton appli est bien faite
(bien découpée), tu dois manipuler ce champ avec des fonctions bien
isolées. Au pire, tu peux changer l'implémentation physique des 2
ou 3 fonctions qui manipulent ce champ, si ça devenait nécessaire.

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
jean-marc
"Fred" a écrit dans le message de
news:%
dans : news:44c64130$0$32418$,
jean-marc écrivait :


> Hello,

Hello,

> Je réponds en double avec Fred, j'avais déjà presque fini :-)

Je savais que tu étais dans le coin : j'ai fait court ;-)
Bravo pour l'exposé !



merci :-) Avec celui de François, clair et didactique, notre ami
Driss peut devenir un expert en maniement des puissances de 2 :-)

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
1 2