IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

Calcul de permissions UNIX avec puissance de 2


Sujet :

Mathématiques

  1. #1
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 53
    Points
    53
    Par défaut Calcul de permissions UNIX avec puissance de 2
    Bonjour à tous,
    Je me trouve confronté à un problème que je n'arrive pas à résoudre. Mais je pense qu'il doit y avoir une règle mathématique pour le résoudre..
    Dans une application informatique existante, un champ permet de stocker un entier qui correspond à l'addition de différentes puissances de 2 pour définir des permissions.
    Ces permissions sont composées ainsi :

    1 2 3 4 5 6 7 8 9
    1 2 4 8 16 32 64 128 256

    Par exemple si j'ai le droit 14789 j'ai dans mon champ la valeur : 1+ 8 + 64 + 128 + 256 = 457

    1 2 3 4 5 6 7 8 9
    1 2 4 8 16 32 64 128 256

    La totalité des droits se représente donc ainsi 123456789, qui nous donne la valeur maximum : 1+2+4+8+16+32+64+128+256 = 511

    Jusqu'ici tout va bien rien de sorcier, similaire aux droits sous unix.

    Maintenant ce que je souhaite faire c'est modifier la valeur décimale de façon à retirer des droits précis.
    Par exemple trés simplement si la totalité des droits sont activés, j'ai 511 et donc si je veux retirer les droits 4 et 5, c'est simple je fais 511 - (8 +16) = 487
    Là où ça se complique c'est dans le cas où je me retrouve dans le premier exemple que j'ai donné plus haut (457).
    En effet ici, si je veux enlever les droits 4 et 5, je ne peux évidemment pas faire 487 - (8+16), puisque le droit 4 est déjà actif. Comment faire donc en partant d'une valeur décimale pour retirer les droits avec les puissances de 2 correspondantes ?
    Est-ce qu'il y aune factorisation à appliquer, où une autre règle mathématique à utiliser ?

    Merci d'avance aux matheux pour votre aide et vos éclaircissements !

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 421
    Points : 5 820
    Points
    5 820
    Par défaut
    salut

    ta valeur correspont a 2^n-1

    donc il te faut retrouver les elements qui compose ta valeur

    en faisant des division par 2 successive
    ensuite en cherchant la valeur de puissance 2 comprise entre la valeur et la division par 2

    exemple de la decomposition pour 487
    DIV2 CALCUL RESTE PUISSANCE
    243 487-2^(9-1) 231 9
    115 231-2^(8-1) 103 8
    51 103-2^(7-1) 39 7
    19 39-2^(6-1) 7 6
    3 7-2^(3-1) 3 3
    1 3-2^(2-1) 1 2
    0 1-2^(1-1) 0 1
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 396
    Points
    9 396
    Par défaut
    Je pense que l'objet de ta question, c'est pour un objectif de programmation.
    En informatique, cette opération s'appelle le ET binaire.
    Tu peux faire l'exercice mathématique ... mais tu peux aussi utiliser les outils qui sont à ta disposition. Et généralement, tu auras un opérateur & qui te permet d'obtenir facilement le résultat.

    Exemple, en Windev :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i, j est un entier 
    i=457
    j=511-(8+16)
    info (i & j)
    Ce code affiche 449, ce qui est le résultat voulu.

    On a même cette syntaxe qui fonctionne, et donne le même résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i, j est un entier 
    i=457
    j=8+16
    info (i & Nonbinaire (j))
    Je pense qu'il existe un équivalent dans des langages classiques, mais je ne connais pas trop la syntaxe (peut-être i & ^j ?)

    Les mots clés pour avancer dans tes recherches, c'est ET binaire, OU Binaire , et NON binaire.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  4. #4
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 53
    Points
    53
    Par défaut
    Alors là je ne m'attendais pas à une réponse aussi rapide, et en plus 2 pour le prix d'une !
    Merci à vous 2 pour ces éclaircissements mathématiques et informatiques.
    Vous répondez à 100% à mon problème, c'était tout à fait ça que je cherchais, mais sans arriver à le formuler.

    Donc merci anapurna pour cette démonstration mathématique qui me permet de bien visualiser la méthode.
    Et merci tbc92 de m'avoir rafraîchi la mémoire, car effectivement c'est le ET binaire et OU binaire qu'il me fallait et que j'avais déjà utilisé il y a quelques années en VB.NET pour communiquer avec un automate.
    Là je vais en avoir besoin en SQL pour modifier des valeurs sur un grand nombre d'enregistrements, je vais pouvoir chercher plus facilement à présent grâce à vous 2.

    Encore un grand merci pour votre efficacité!

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    juste pour précision, pour activer un bit dans le champs éponyme on utilisera le OU, classiquement un truc du genre :
    dans la plupart des langages, | est un OU, & est un ET, ! est un NON, et ~ le complément (à 1 ou à 2 c'est selon)

    tandis que pour mettre un bit à 0 on utilise un ET avec un masque binaire équivalent à la valeur max moins la valeur du bit à retirer
    exemple, si on a un champs de bits contenant 4 bits, la valeur minimum est 0000 (0), la valeur max est 1111 (15, ou "8|4|2|1")
    admettons qu'on ait la valeur 11 (cf au dessus) et qu'on veuille retirer le bit de valeur 2, on fera donc 11 ET (max - 2), soit 11 & 13 (qui donne 9)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       1011   (11)
     & 1101   (13)
     ------
       1001   (9)
    et on peut en fait calculer le masque différemment, comme étant la valeur binaire inverse de celle que l'on souhaite retirer, éventuellement bornée par la taille du champs de bits c'est à dire la valeur max, soit ~val & max (le complément permet donc d'inverser les bits)

    à l'arrivée, on prend l'exemple d'un champs de bits contenant 8 bits, soit une valeur max de 255, la valeur de départ est disons 11010110 soit 214 en décimal.
    on souhaite retirer les valeurs 64, 16 et 2, on pourrait donc écrire quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (128 | 64 | 16 | 4 | 2) & (~(64 | 16 | 2) & 255)
    = 214 & (~82 & 255)
    = 214 & 173    en binaire: 11010110 & 10101101
    = 132          en binaire: 10000100
                                ^ ^  ^
                                | |  |
                               64 16 2

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. calcul avec puissance
    Par bast95 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 21/12/2008, 18h40
  2. Réponses: 2
    Dernier message: 03/07/2007, 08h38
  3. [C#] Calcul sur les dates avec des DateTimePicker
    Par alizee971 dans le forum Windows Forms
    Réponses: 10
    Dernier message: 02/04/2005, 17h14
  4. Réponses: 4
    Dernier message: 02/11/2004, 15h18
  5. Calcul d'un total avec Rave Report
    Par webbulls dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/05/2004, 13h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo