2009-08-12 6 views
0

À partir des documents Oracle.Solution standard pour décoder les numéros d'additif

Un nombre représentant une ou plusieurs classes de statistiques. Les numéros de classe suivants sont additifs:

1 - User 
    2 - Redo 
    4 - Enqueue 
    8 - Cache 
    16 - OS 
    32 - Real Application Clusters 
    64 - SQL 
    128 - Debug 

Il y une solution standard pour la prise dire 22 et décodage en 16, 4 et 2? Ma première supposition serait de créer un objet qui détient toutes les combinaisons possibles et l'utiliser comme une recherche? Y at-il une meilleure solution en utilisant binaire ou quelque chose? La solution préférée serait en Python. (avertissement: Ce n'est pas un devoir.)

Répondre

4

Vous souhaitez utiliser des opérations binaires pour décoder l'original. Le code suivant renvoie en fait les chaînes correctes:

>>> FLAGS = ('User', 'Redo', 'Enqueue', 'Cache', 'OS', 
...   'Real Application Clusters', 'SQL', 'Debug') 
>>> def getFlags(value): 
... flags = [] 
... for i, flag in enumerate(FLAGS): 
...  if value & (1 << i): 
...  flags.append(flag) 
... return flags 
... 
>>> print getFlags(22) 
['Redo', 'Enqueue', 'OS'] 

Si vous voulez vraiment que les constantes:

>>> def binaryDecomposition(value): 
... return [1 << i for i in xrange(len(FLAGS)) if value & (1 << i)] 
... 
>>> print binaryDecomposition(22) 
[2, 4, 16] 
+2

def getFlags (value): return [drapeau pour i, drapeau dans enumerate (FLAGS) if value & (1 << i)] – hughdbrown

4

Chacune de ces valeurs correspond à un seul bit. Alors utilisez le binaire.

1<<0 - 1 - User 
1<<1 - 2 - Redo 
1<<2 - 4 - Enqueue 
1<<3 - 8 - Cache 
1<<4 - 16 - OS 
1<<5 - 32 - Real Application Clusters 
1<<6 - 64 - SQL 
1<<7 - 128 - Debug 

Utilisez & pour tester chaque bit.

def decode(value): 
    readable = [] 
    flags = ['User', 'Redo', 'Enqueue', 'Cache', 'OS', 
      'Real Application Clusters', 'SQL', 'Debug'] 
    for i, flag in enumerate(flags): 
     if value & (1<<i): 
      readable.append(flags[i]) 
    return readable 

print decode(22) 
+0

, vous devriez avoir une variable qui rendent également plus facile de comprendre ce que vous faites, par exemple as (USER_FLAG | flags) ou (RAC_FLAG | flags) –

+0

En C, je serais d'accord avec vous. Mais en python, utilisez l'index dans une liste pour cela. – retracile

+0

def getFlags (value): flags = ['Utilisateur', 'Redo', 'Enqueue', 'Cache', 'OS', 'Real Application Clusters', 'SQL', 'Déboguer'] return [signaler pour je, drapeau dans enumerate (drapeaux) si value & (1 << i)] – hughdbrown

Questions connexes