解码附加数的标准解决方案

时间:2009-08-12 18:56:07

标签: python algorithm

来自Oracle文档。

  

表示一个或多个统计类的数字。以下类别编号是附加的:

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

有一个标准的解决方案,可以说22并将其解码为16,4和2?我的第一个猜测是创建一个包含每个可能组合的对象并将其用作查找?有没有更好的解决方案使用二进制或什么?首选的解决方案是在Python中。 (免责声明:这不是作业。)

2 个答案:

答案 0 :(得分:4)

这些值中的每一个对应于单个位。所以使用二进制文件。

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

使用&amp;测试每一位。

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)

答案 1 :(得分:4)

您想使用二进制操作来解码原始文件。以下代码实际返回正确的字符串:

>>> 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']

如果你真的只想要常数:

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