如何以幻数存储查找表?

How do I store lookup tables in magic numbers?

我看到了一些有趣的东西 here,说你可以将查找 table 存储在幻数中。

我曾尝试使用暴力破解幻数,但所有结果都不正确。

如何找到特定查找的正确幻数 table? 谢谢。

正如该回答的作者所说:

The magic number stores the table as a bitstring, with the n-th digit (from the end) corresponding to the nth table entry

这是一个非常简单的例子:

Entry   Value   Bit
-----   -----   ---
  0     True     1
  1     False    0
  2     False    0
  3     True     1
                 b  # needed to indicate
                 0  # 'binary number'

因此,此查找 table 的 "magic number",从底部 向上读取 ,是:

>>> 0b1001  # (1 * 8) + (0 * 4) + (0 * 2) + (1 * 1)
9

或者,旋转它:

              3      2      1      0      | Entry
              True   False  False  True   | Value
0      b      1      0      0      1      | Bit    # -> 0b1001

在提取输出方面,right-shift binary operator x >> yx 中的所有位向右移动 y 位,截断最后 y 位:

>>> for x in range(4):
        print(x, '0b{:04b}'.format(9>>x))


0 0b1001
1 0b0100
2 0b0010
3 0b0001

bitwise AND & 1 告诉你最后一位的值。返回结果:

>>> for x in range(4):
    print(x, 9>>x&1)


0 1
1 0
2 0
3 1

另一个例子:

Entry   Value   Bit
-----   -----   ---
  0     True     1
  1     False    0
  2     True     1
  3     False    0
                 b  # needed to indicate
                 0  # 'binary number'

因此,此查找 table 的 "magic number",从底部 向上读取 ,是:

>>> 0b0101  # (0 * 8) + (1 * 4) + (0 * 2) + (1 * 1)
5

或者,旋转它:

              3      2      1      0      | Entry
              False  True   False  True   | Value
0      b      0      1      0      1      | Bit    # -> 0b0101