【问题标题】:How do I store lookup tables in magic numbers?如何以幻数存储查找表?
【发布时间】:2015-08-20 02:50:32
【问题描述】:

我看到了一些有趣的here,说你可以用幻数存储查找表。

我曾尝试使用蛮力查找幻数,但所有结果都不正确。

如何为某个查找表找到正确的幻数? 谢谢。

【问题讨论】:

    标签: python dictionary lookup-tables magic-numbers


    【解决方案1】:

    正如该答案的作者所说:

    幻数将表存储为位串,n-th 对应于nth 表条目的数字(从末尾开始)

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

    Entry   Value   Bit
    -----   -----   ---
      0     True     1
      1     False    0
      2     False    0
      3     True     1
                     b  # needed to indicate
                     0  # 'binary 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 operatorx >> 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'
    

    所以这个查找表的“幻数”从底部向上读取,是:

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

    【讨论】:

    • 哦,我以为你必须暴力破解它。哦,好的,谢谢。我会将此标记为已接受的答案。
    • 我在做的时候得到了和你同一张桌子随机
    • @AnirudhBalaji 你是什么意思“没有正常工作”?如果幻数是8magic_num>>x&1 == 1x == 3时。
    • 但是你说你是从下往上读的!我也这样做了,得到的二进制表示:0b1000
    • @AnirudhBalaji 我不明白你为什么认为这让我错了。 0b1000 == 8,所以只选择了第四项(索引3)。
    猜你喜欢
    • 2019-12-27
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 2013-12-31
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多